#include <iostream>
using namespace std;
int main()
{
int v1 = 1, v2 = 4;
auto sum_return_lambda = [](int var1) -> auto { return [&var1](int var2 ) { return var1 + var2; }; };
// sum_return_lambda returns auto type, which is a lambda function: [var1](var2){ return var1 + var2;}.
// This returned lambda function takes one parameter: var2
auto dbl = [](const auto& func, int var2) { return func(var2) * 2;};
auto returned_lambda = sum_return_lambda(v1);
cout << "returned_lambda(v2)= " << returned_lambda(v2) << endl;
cout << "dbl(returned_lambda, v2)= " << dbl(returned_lambda, v2) << endl;
cout << "v1: "<< v1 << ", v2: " << v2 << endl;
return 0;
}
v1 = 1,v2 = 4,v1通过引用传入,我期望return_lambda(v2)= 5,dbl(return_lambda,v2)= 10。
但这是我得到的:返回的λ(v2)= 8数据库(返回的λ,v2)= 65542
在程序结束时,我检查了v1和v2的值,它们没有改变:版本1:1,版本2:4
65542从何而来?为什么返回_lambda(v2)= 8而不是5??
谢谢大家!
1条答案
按热度按时间e4eetjau1#
问题就在这里:
这里
var1
是外部lambda表达式的局部变量,从它返回的lambda包含一个悬空引用,如果你想捕获传递给sum_reference_lambda
的变量,你必须通过引用传递它:Live Demo
65542从何而来?为什么返回_lambda(v2)= 8而不是5??
代码的输出可能是任何内容,因为它具有未定义的行为。