Lambda捕获

bol*_*lov 3 c++ lambda closures

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

我认为一个简单的方法就是通过例子.因此,让每个案例都有一个案例(如果有更多表达同一事物的方式,则更多):

捕获:

  • 没有
  • 全部参考
  • 所有的价值
  • r1,r2参考.没有其他的.
  • v1,v2按价值.没有其他的.
  • r1,r2参考.按价值休息.
  • v1,v2按价值.通过参考休息.
  • r1,r2参考v1,v2按价值.没有其他的.

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

Vit*_*meo 11

简而言之:

[]{ }          // 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
Run Code Online (Sandbox Code Playgroud)

在C++ 14中,您还有一般化的lambda捕获:

[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]{ }
Run Code Online (Sandbox Code Playgroud)

如果你想通过引用或通过值有条件地捕捉,你可以使用通用的λ捕捉来实现某种形式的"完美转发捕捉"的:"在lambda表达式捕捉完美转发的对象".


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

[this]{ }  // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 7

| 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] |
Run Code Online (Sandbox Code Playgroud)

规则很简单:前面是a &,通过引用捕获.仅限名称,按值捕获.

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


可以在cppreference上读取完整规则.