Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过引用捕获Lambda_C++_Lambda - Fatal编程技术网

C++ C++;通过引用捕获Lambda

C++ C++;通过引用捕获Lambda,c++,lambda,C++,Lambda,据我所知,在运行以下代码之后,myString应该得到值“insidelambda3.secondLambda”。相反,它仍然具有值“Initialized” 第一个lambda通过引用捕获所有变量,第二个仅通过引用捕获myString。为什么它的行为不符合我的预期?您已经定义了一个闭包,但没有实际运行该函数。如果要执行它的主体,实际上必须像lambda3()那样运行它 但是,您有嵌套的lambda,因此还需要运行lambda中的内容。不清楚你为什么要这样做。内部lambda既不是在外部lamb

据我所知,在运行以下代码之后,myString应该得到值“insidelambda3.secondLambda”。相反,它仍然具有值“Initialized”


第一个lambda通过引用捕获所有变量,第二个仅通过引用捕获myString。为什么它的行为不符合我的预期?

您已经定义了一个闭包,但没有实际运行该函数。如果要执行它的主体,实际上必须像
lambda3()
那样运行它

但是,您有嵌套的lambda,因此还需要运行lambda中的内容。不清楚你为什么要这样做。内部lambda既不是在外部lambda的作用域内分配的(因此可以使用相同的语法在lambda内运行),也不是返回的(因此此lambda的调用方可以运行它返回的内容)

如果您返回了它,您可以执行
lambda3()()

注意:仅添加了单词
return
,以允许
lambda3()()
工作

在这个特定示例中,您只需:

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

您已经定义了一个闭包,但没有实际运行该函数。如果要执行它的主体,实际上必须像
lambda3()
那样运行它

但是,您有嵌套的lambda,因此还需要运行lambda中的内容。不清楚你为什么要这样做。内部lambda既不是在外部lambda的作用域内分配的(因此可以使用相同的语法在lambda内运行),也不是返回的(因此此lambda的调用方可以运行它返回的内容)

如果您返回了它,您可以执行
lambda3()()

注意:仅添加了单词
return
,以允许
lambda3()()
工作

在这个特定示例中,您只需:

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

通过指定lambda的主体,可以指定在调用lambda的
操作符()
时将调用的代码

因此,您需要实际调用lambda,否则它只是函数定义中的代码,永远不会被调用。你可以做:

auto lambda3 = [&] {
  auto l = [&myString] {
    myString = "Inside lambda3.secondLambda";
  };
  l();
};
lambda3();
为了更进一步,您可以返回内部lambda,然后按如下方式执行它:

auto lambda3 = [&] {
  return [&myString] {
    myString = "Inside lambda3.secondLambda";
  };
};
lambda3()();

通过指定lambda的主体,可以指定在调用lambda的
操作符()
时将调用的代码

因此,您需要实际调用lambda,否则它只是函数定义中的代码,永远不会被调用。你可以做:

auto lambda3 = [&] {
  auto l = [&myString] {
    myString = "Inside lambda3.secondLambda";
  };
  l();
};
lambda3();
为了更进一步,您可以返回内部lambda,然后按如下方式执行它:

auto lambda3 = [&] {
  return [&myString] {
    myString = "Inside lambda3.secondLambda";
  };
};
lambda3()();


实际上,你从来没有把这些闭包称为闭包。你希望他们被处决吗?好的,这很有道理。那么在这种情况下我如何运行它们呢?取决于您实际想要做什么。您是想调用
lambda3()
来同时调用内部闭包,还是想返回它以便调用
lambda3()()
?我不是舒尔。最后,我希望得到myString所需的值,即@CPJ中的“insidelambda3.secondLambda”,但lambda类似于一个函数。假设您有一个函数foo(),它设置一个字符串。除非你打电话给你的朋友,否则什么都不会发生!实际上,你从来没有把这些闭包称为闭包。你希望他们被处决吗?好的,这很有道理。那么在这种情况下我如何运行它们呢?取决于您实际想要做什么。您是想调用
lambda3()
来同时调用内部闭包,还是想返回它以便调用
lambda3()()
?我不是舒尔。最后,我希望得到myString所需的值,即@CPJ中的“insidelambda3.secondLambda”,但lambda类似于一个函数。假设您有一个函数foo(),它设置一个字符串。除非你打电话给你的朋友,否则什么都不会发生!因此,如果我不返回内部lambda,将不会运行它(第二个lambda)?如果您只返回一个lambda,该lambda在本地作用域中定义了lambda,但从未使用它,则不会调用它。无论何时定义lambda,它的代码都不会运行(除了闭包中的初始化),直到您真正运行它为止。@CPJ lambda就像一个函数定义——您仍然必须通过调用它来执行它,它不会自行运行。您有两个lambda,因此必须显式调用这两个lambda。因此,如果我不返回内部lambda,将不会运行它(第二个lambda)?如果您只返回一个lambda,该lambda在本地范围中定义了lambda,但从未使用过它,则不会调用它。无论何时定义lambda,它的代码都不会运行(除了闭包中的初始化),直到您真正运行它为止。@CPJ lambda就像一个函数定义——您仍然必须通过调用它来执行它,它不会自行运行。您有两个lambda,因此必须显式调用这两个lambda。谢谢。这只是一个非特定示例的测试。我知道我可以在外部lambda中修改myString,但是这个内部lambda的胡说八道是用于其他场景的。谢谢。这只是一个非特定示例的测试。我知道我可以在外部lambda中对myString进行修改,但内部lambda的这种胡说八道是用于其他场景的。