#include <iostream>
auto get_lambda()
{
int i = 5;
auto lambda = [&i]() { std::cout << i << '\n'; };
return lambda;
}
int main()
{
auto lambda = get_lambda();
lambda();
}
在“ get_lambda”函数中,我定义了局部变量“ i”。然后,该函数返回lambda对象,该对象具有对该局部变量的一个捕获引用。在“ main”内部,我将其称为lambda,而“ i”却是未初始化的内存。
变量“ i”位于get_lambda的堆栈上。函数返回时,该堆栈不再有效。
为什么这段代码甚至可以编译,而变量'i'到底发生了什么,在get_lambda之外仍然可以使用?
就您而言,您正在调用未定义的行为。该i
名称是get_lambda()
函数的本地名称,一旦i
超出范围,它就会被销毁。因此,通过lambda,您现在可以存储对不再存在的内容的引用。这也称为悬挂参考。而是通过值捕获局部变量:
auto lambda = [i]() { std::cout << i << '\n'; };
要么:
auto lambda = [=]() { std::cout << i << '\n'; };
实际上,您可以通过lambda的捕获列表中的引用来捕获本地人。因此,没有编译器错误。根据编译器的不同,可能会发出警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句