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)
[*this] 在C++ 17中引入.
请注意,这[&this]是一个语法错误.
| 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上读取完整规则.
| 归档时间: |
|
| 查看次数: |
310 次 |
| 最近记录: |