C ++ Lambda通过引用捕获

时间:2016-02-22 15:09:17

标签: c++ lambda

据我所知,在运行以下代码之后,myString应该具有值“Inside lambda3.secondLambda”。相反,它仍然具有“已初始化”的值。

std::string myString("Initialized");
auto lambda3 = [&]() { [&myString]() { myString = "Inside lambda3.secondLambda"; }; };

第一个lambda通过引用捕获所有变量,而sencond仅通过引用捕获myString。为什么它不像我预期的那样表现?

2 个答案:

答案 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"; };