在学习 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
这背后的原因是什么?
最佳答案
因为未定义的行为。
tmp
在 f1
被赋值后被销毁,所以 tmp_p
变成了一个悬空指针。当您取消引用它时,任何事情都可能发生,包括有时给出正确的值 15
,有时不是 5772973
。
f2
也是一样,但是你没有使用指针,而是使用了引用,它引用了一个被破坏的对象,这也是未定义的行为。
关于c++ - 在这种情况下被 lambda 输出混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267982/