如何更新嵌套lambda函数中的变量(C ++)

时间:2017-12-19 02:56:49

标签: c++ lambda nested

我有两个lambda函数。

    void func1 ( const std::function< void( std::string ) >& handler );
    void func2 ( const std::function< void( std::string ) >& handler );

    int main()
    {
      func1( []( std::string str1 ) {
        int a = std::stoi( str1 );
        func2( [&a]( std::string str2 ) {
           a += std::stoi( str2 );
        } );

        // a = ?
       });
    }

我的问题是:a =?

  1. std :: stoi(str1)。
  2. std :: stoi(str1)+ std :: stoi(str2)。

3 个答案:

答案 0 :(得分:1)

a将继续在第一个lambda中跟随,因为第二个lambda被声明但从未执行过(它只是传递给func2)。

std::stoi( str1 )

如果您在func2定义中执行捕获lambda,a的值将更改为:

std::stoi( str1 ) + std::stoi( str2 )

PS:你需要在lambda的末尾添加一个额外的括号来执行它。

答案 1 :(得分:1)

如果你的程序对于lambdas真的很简单,你实际上是第二个(一次),变量a应该等于std::stoi( str1 ) + std::stoi( str2 )

变量a通过引用传递给内部lambda,这意味着它在lambda中的变化将反映在外部lambda的范围内,

  

访问变量时,访问其捕获的副本(对于   由副本捕获的实体)或原始对象(用于实体)   通过参考获取)。

根据this参考。

这可以使用main中的简单测试显示:

int main()
{
    auto f1 = []()
    {
        int var = 5;
        auto f2 = [&var]() {var--;};
        f2();
        std::cout << var << std::endl;
    };

    f1();
}

此处f1()声明通过引用传递给var的变量f2。调用f2后,var递减varf2的值变为4.

答案 2 :(得分:0)

答案是3)这取决于func2的作用。它调用处理程序和用什么字符串多少次?每次都会增加一个