在函数中使用 lambda 时,其是不是相当于一个局部变量?如果函数跑完,它是不是就释放了?比如:
void test()
{
auto func = []{
//TODO;
}
}
但是在 QT 中,如果 lambda 被 connect ,即使函数结束后,它也能被调用:
void test()
{
auto func = []{
//TODO;
}
connect(m_button, &QPushButton::clicked, this, func);
}
1
ysc3839 2021-12-24 18:10:02 +08:00 via Android
可能 connect 拷贝了一份 lambda
|
2
zhttp 2021-12-24 18:12:15 +08:00
|
3
iamzuoxinyu 2021-12-24 18:14:06 +08:00
lambda 实例被传递给 `connect` 相当于延长了它的生命周期,要么传值,要么被 move 进去,要看 `connect` 的实现。
|
4
minimum 2021-12-24 19:45:05 +08:00
lambda 定义的时候:等号右边是一个字面值常量( literal constant ),和 123/true/false/"hello"这些一样,存储在常量区,在函数运行期间是一直存在的;等号左边的 func 是一个变量,给这个内存地址一个 name 。connect 函数的最后一个形参应该是一个 callable 的函数指针,把 lambda 函数的指针传入 connect 后在内部就能调用这个 lambda 了
|
5
iamzuoxinyu 2021-12-24 20:43:39 +08:00
@minimum 不是的,等号右边是一个右值,不是个常量。赋值给`func`后变成一个左值。至于 connect ,这里应该被 cast 成了一个 Functor ,可以看 connect 的声明:
```c++ connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type) ``` > The lambda expression is a prvalue expression of unique unnamed non-union non-aggregate class type, known as closure type, which is declared (for the purposes of ADL) in the smallest block scope, class scope, or namespace scope that contains the lambda expression. |
6
minimum 2021-12-25 02:05:12 +08:00
@iamzuoxinyu 受教受教,你是对的,我对 lambda 的理解确实有些偏差
|
8
yaron OP @iamzuoxinyu 谢谢,明白了
|