首页
学习
活动
专区
圈层
工具
发布

兰博达
EN

Stack Overflow用户
提问于 2017-10-18 12:12:23
回答 3查看 659关注 0票数 3

我总是对lambda捕获感到困惑,我不知道变量是通过引用还是通过值捕获的。例如,如果我有[a],我不知道a是通过值还是由引用捕获的。

我认为一个简单的方法来获得它将是通过例子。因此,让我们为每一种情况提供一个(如果有更多表达相同事物的方法的话,则更多):

捕获:

  • 没什么
  • 全凭参考
  • 全部按价值计算
  • r1r2。没别的了。
  • v1,按值计算的v2。没别的了。
  • r1r2。按价值休息。
  • v1,按值计算的v2。参考休息。
  • r1r2v1v2。没别的了。

让我们完全忽略this,因为这是另一袋蠕虫。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-18 12:19:25

代码语言:javascript
复制
| Capture                                       | Syntax             |
| --------------------------------------------- | ------------------ |
| nothing                                       | []                 |
| all by reference                              | [&]                |
| all by value                                  | [=]                |
| r1, r2 by reference. Nothing else.            | [&r1, &r2]         |
| v1, v2 by value. Nothing else.                | [v1, v2]           |
| r1, r2 by reference. Rest by value.           | [=, &r1, &r2]      |
| v1, v2 by value. Rest by reference.           | [&, v1, v2]        |
| r1, r2 by ref, v1, v2 by value. Nothing else. | [v1, v2, &r1, &r2] |

规则很简单:前面有一个&,引用捕获。只命名,按值捕获。

默认值:=全部按值,&全部按引用。从“所有”中排除的东西使用上面的简单规则。

完整的规则可以在优先选择上读取。

票数 8
EN

Stack Overflow用户

发布于 2017-10-18 12:19:03

简言之:

代码语言:javascript
复制
[]{ }          // do not capture anything
[foo]{ }       // capture `foo` by value
[&foo]{ }      // capture `foo` by reference
[foo, &bar]{ } // capture `foo` by value, `bar` by reference
[=, &foo]{ }   // capture everything by value, `foo` by reference
[&, foo]{ }    // capture everything by reference, `foo` by value

在C++14中,您还获得了广义lambda捕获。

代码语言:javascript
复制
[i=0]{ }  // create closure with `i` data member initialized to `0`
[i=j]{ }  // create closure with `i` data member initialized to `j`
[i{0}]{ } // create closure with `i` data member initialized to `0`
[i{j}]{ } // create closure with `i` data member initialized to `j`

// create closure with `uptr` data member initialized to `std::move(uptr)`
[uptr = std::move(uptr)]{ } 

// create closure with `foo` reference data member initialized to `something`
[&foo = something]{ }

如果您想通过引用或值有条件地捕获,可以使用广义lambda捕获来实现某种“完美转发捕获”:在lambdas中捕获完全转发的对象

让我们完全忽略this,因为这是另一袋蠕虫。

代码语言:javascript
复制
[this]{ }  // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure
票数 11
EN

Stack Overflow用户

发布于 2017-10-18 12:18:55

  • 没什么 []
  • 全凭参考 &
  • 全部按价值计算 =
  • r1r2。没别的了。 &r1,&r2
  • v1,按值计算的v2。没别的了。 v1,v2
  • r1r2。按价值休息。 =,&r1,&r2
  • v1,按值计算的v2。参考休息。 &,v1,v2
  • r1r2v1v2。没别的了。 &r1,&r2,v1,v2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46809901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档