C++ 如何更新嵌套lambda函数(C+;+;)中的变量
我有两个lambda函数C++ 如何更新嵌套lambda函数(C+;+;)中的变量,c++,lambda,nested,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
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 = ?
});
}
void func1(const std::function&handler);
void func2(const std::function&handler);
int main()
{
func1([](std::string str1){
INTA=std::stoi(str1);
func2([&a](标准::字符串str2){
a+=std::stoi(str2);
} );
//a=?
});
}
我的问题是:a=
a
将保留在第一个lambda中,因为第二个lambda已声明但从未执行(它只是在func2
中传递)
如果在func2
定义中执行捕获lambda,则a
的值将更改为:
std::stoi( str1 ) + std::stoi( str2 )
PS:您需要在lambda的末尾加一个括号来执行该操作。答案是3)这取决于func2的功能。它调用处理程序多少次,使用什么字符串?每次,如果你的程序对于lambda真的这么简单,并且你实际上调用了第二个变量(一次),那么变量a应该等于std::stoi(str1)+std::stoi(str2) 变量
a
通过引用传递给内部lambda,这意味着它在lambda内部的更改将反映在外部lambda的范围内
访问变量时,访问其捕获的副本(对于
通过复制捕获的实体)或原始对象(对于实体)
通过引用捕获)
根据参考资料
这可以通过使用main
中的简单测试来显示:
int main()
{
auto f1 = []()
{
int var = 5;
auto f2 = [&var]() {var--;};
f2();
std::cout << var << std::endl;
};
f1();
}
intmain()
{
自动f1=[]()
{
int-var=5;
自动f2=[&var](){var--;};
f2();
std::cout a的当前值是多少?您得到的输出是什么?a的值?不要要求我们执行您的程序:/n您实际上没有调用lambda函数,因此a没有值。您是否计划在创建函数后立即或稍后调用函数?向我们显示func1和func2的定义以获得正确答案。抱歉因为我发现这个问题阻止了我。“A”是第一个lambda函数中的内部变量,并且希望在第二个lambda函数中更新“a”,并返回更新后的“a”。我删除了返回“a”的代码。如果它被执行,它是通过引用传递的,而我的猜测是它会改变。更多。正在添加。您的代码似乎与我的代码相似。您的代码运行良好,但我的代码运行不正常。我将进一步检查我的代码。好像“var”仍然是5而不是4。您使用的是完全相同的程序吗?对我来说是4。“我的代码”是指我问题中的上述代码,不是你的程序。我尝试了你的代码,效果很好。它是4。基于你的问题的嵌套lambda给出的结果与我的帖子中的结果相同。我可以发布,这就是你问题的答案,我想是的。我不确定的是如何将其转换为类似于你代码中的函数,你如何调用SE?我还是C++新手。
int main()
{
auto f1 = []()
{
int var = 5;
auto f2 = [&var]() {var--;};
f2();
std::cout << var << std::endl;
};
f1();
}