c++ Lambda函数,通过引用访问Var1,结果很奇怪

7kjnsjlb  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(153)
#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??
谢谢大家!

e4eetjau

e4eetjau1#

问题就在这里:

auto sum_return_lambda = [](int var1) -> auto { return [&var1](int var2 ) { return var1 + var2; }; };
                             // ^^^

这里var1是外部lambda表达式的局部变量,从它返回的lambda包含一个悬空引用,如果你想捕获传递给sum_reference_lambda的变量,你必须通过引用传递它:

auto sum_return_lambda = [](int& var1) -> auto { return [&var1](int var2 ) { return var1 + var2; }; };

Live Demo
65542从何而来?为什么返回_lambda(v2)= 8而不是5??
代码的输出可能是任何内容,因为它具有未定义的行为。

相关问题