据我所知,在运行以下代码之后,myString应该具有值“Inside lambda3.secondLambda”。相反,它仍然具有“已初始化”的值。
std::string myString("Initialized");
auto lambda3 = [&]() { [&myString]() { myString = "Inside lambda3.secondLambda"; }; };
第一个lambda通过引用捕获所有变量,而sencond仅通过引用捕获myString。为什么它不像我预期的那样表现?
答案 0 :(得分:4)
通过指定lambda的主体,指定在调用lambda的operator()
时将调用的代码。
所以你需要实际调用lambdas,否则它只是函数定义中的代码,它永远不会被调用。你可以这样做:
auto lambda3 = [&] {
auto l = [&myString] {
myString = "Inside lambda3.secondLambda";
};
l();
};
lambda3();
为了更进一步,你可以返回内部lambda然后像这样执行它:
auto lambda3 = [&] {
return [&myString] {
myString = "Inside lambda3.secondLambda";
};
};
lambda3()();
答案 1 :(得分:1)
您已定义了一个闭包,但实际上并未运行该函数。如果你想执行它的主体,你必须像lambda3()
一样运行它。
但是,你有嵌套的lambda,所以你也需要运行lambda中的内容。不清楚你为什么要这样做。你的内部lambda既没有在外部lambda的范围内分配(所以你可以使用相同的语法在lambda中运行它),或者返回(所以这个lambda的调用者可以运行它返回的内容)。
如果您将其退回,则可以执行lambda3()()
:
auto lambda3 = [&]() { return [&myString]() { myString = "Inside
lambda3.secondLambda"; }; };
注意:只添加了单词return
以允许lambda3()()
生效。
在这个特定的例子中,你可以更好地服务于:
auto lambda3 = [&myString]() {
myString = "Inside lambda3.secondLambda"; };