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

问题描述 投票:-3回答:3

我有两个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:stand(p1)。
  2. std :: stands(第1页)+ stand :: stands(第2页)。
c++ lambda nested
3个回答
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。


1
投票

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

std::stoi( str1 )

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.