我有两个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 =?
答案 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
递减var
,f2
的值变为4.
答案 2 :(得分:0)
答案是3)这取决于func2的作用。它调用处理程序和用什么字符串多少次?每次都会增加一个