c++ - 在这种情况下被 lambda 输出混淆

标签 c++ c++11 lambda

在学习 C++11 中的 lambda 之后,我写了这个并对输出感到困惑。

auto f1 = [] () {
    int tmp = 10;
    int *tmp_p = &tmp;
    return [tmp_p] (int x) {
        return *tmp_p + x;
    };
}();

auto f2 = []() {
    int tmp = 10;
    return [&tmp] (int x) {
        return tmp + x;
    };
}();

cout << f1(5) << endl;
cout << f1(5) << endl;

cout << f2(5) << endl;
cout << f2(5) << endl;

输出是:

15
5772973
2686617
2686617

这背后的原因是什么?

最佳答案

因为未定义的行为。

tmpf1 被赋值后被销毁,所以 tmp_p 变成了一个悬空指针。当您取消引用它时,任何事情都可能发生,包括有时给出正确的值 15,有时不是 5772973

f2 也是一样,但是你没有使用指针,而是使用了引用,它引用了一个被破坏的对象,这也是未定义的行为。

关于c++ - 在这种情况下被 lambda 输出混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267982/

相关文章:

c# - 使用 lambda 表达式查找计数

java - 为什么无法加载 lambda 类?

c++ - Guard Page Exception - 如何引发

c++ - 模板类对象的数组

c++ - 使用类名称进行条件宏扩展

正文为 "dynamic"的 C++ lambda 表达式

c++ - 我应该将其声明为该类的 const int 成员变量吗?

c++ - 数组中对象的私有(private)成员不可修改

c++ - c++11 编译器中出现额外限定错误的问题

c++ - g++ 4.8.2 在列表方法参数默认初始化时出错