在函数中使用 lambda 时,其是不是相当于一个局部变量?如果函数跑完,它是不是就释放了?比如:
void test()
{
	auto func = []{
		//TODO;
	}
}
但是在 QT 中,如果 lambda 被 connect ,即使函数结束后,它也能被调用:
void test()
{
	auto func = []{
		//TODO;
	}
	connect(m_button, &QPushButton::clicked, this, func);
}
|  |      1ysc3839      2021-12-24 18:10:02 +08:00 via Android 可能 connect 拷贝了一份 lambda | 
|      2zhttp      2021-12-24 18:12:15 +08:00 | 
|      3iamzuoxinyu      2021-12-24 18:14:06 +08:00 lambda 实例被传递给 `connect` 相当于延长了它的生命周期,要么传值,要么被 move 进去,要看 `connect` 的实现。 | 
|      4minimum      2021-12-24 19:45:05 +08:00 lambda 定义的时候:等号右边是一个字面值常量( literal constant ),和 123/true/false/"hello"这些一样,存储在常量区,在函数运行期间是一直存在的;等号左边的 func 是一个变量,给这个内存地址一个 name 。connect 函数的最后一个形参应该是一个 callable 的函数指针,把 lambda 函数的指针传入 connect 后在内部就能调用这个 lambda 了 | 
|      5iamzuoxinyu      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. | 
|      6minimum      2021-12-25 02:05:12 +08:00 @iamzuoxinyu 受教受教,你是对的,我对 lambda 的理解确实有些偏差 | 
|  |      8yaron OP @iamzuoxinyu 谢谢,明白了 |