如果通过lambda函数对象返回对局部变量的引用,会发生什么情况?

匿名
#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法返回对局部变量的引用

C ++返回对局部变量的引用

如果不引用对象,Java中的对象会发生什么情况,例如:myString.concat(“ that”)

如果未在lambda函数中取消超时处理程序,会发生什么情况?

如果PHP总是按引用复制对象,如果将在方法中创建的对象分配给成员变量,会发生什么情况?

无需简单转换即可返回对局部变量的引用

返回对局部变量的引用 - C++

无法返回对局部变量 `s0` 的引用

返回对局部变量的引用有问题吗?

返回对局部变量的引用工作正常吗?

为什么我要返回对局部变量字段的引用

如果我在不将其返回值分配给变量的情况下调用函数,会发生什么情况?

转义对局部变量的引用

如果在lambda表达式的函数接口中添加不同的参数类型,会发生什么情况?

如果调用析构函数并将分配的内存再次用于其他对象,会发生什么情况?

分配对局部变量的引用,如果局部变量超出范围,会超出范围吗?

如果局部变量在放入通道后失去其作用域会发生什么?

如果KGroupedStream的聚合器返回null,会发生什么情况?

如果我们在App Delegate中的didFinishLaunching中返回NO,会发生什么情况

如果无法通过create()清除Model :: $ id,会发生什么情况?

如果通过SSH连接时更新sshd,会发生什么情况?

如果未将new Class()的结果分配给变量,会发生什么情况

如果在已经初始化的变量上使用`var`会发生什么情况

在Java函数中创建并存储在对象中的对象会发生什么情况?

如果子类未在Java中定义构造函数,会发生什么情况?

如果我使用JNI从C的多个线程中调用Java函数,会发生什么情况?

如果从类文件中删除超级构造函数调用,会发生什么情况?

如果我在PHP函数的末尾不包含“ return”,会发生什么情况?

如果将很少的参数传递给Shell函数,会发生什么情况?