
在函数中使用 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 谢谢,明白了 |