C++ 通过引用捕获 Lambda

C++ Lambda capture by reference

本文关键字:Lambda 引用 C++      更新时间:2023-10-16

我所知,在运行以下代码后,myString应该得到值"Inside lambda3.secondLambda"。相反,它仍将具有值"已初始化"。

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

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

通过指定 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()();

您已经定义了一个闭包,但实际上并未运行该函数。如果要执行其正文,则必须像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"; };