我总是对lambda捕获感到困惑,我不知道变量是通过引用还是通过值捕获的。例如,如果我有[a],我不知道a是通过值还是由引用捕获的。
我认为一个简单的方法来获得它将是通过例子。因此,让我们为每一种情况提供一个(如果有更多表达相同事物的方法的话,则更多):
捕获:
r1,r2。没别的了。v1,按值计算的v2。没别的了。r1,r2。按价值休息。v1,按值计算的v2。参考休息。r1,r2,v1,v2。没别的了。让我们完全忽略this,因为这是另一袋蠕虫。
发布于 2017-10-18 12:19:25
| 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] |规则很简单:前面有一个&,引用捕获。只命名,按值捕获。
默认值:=全部按值,&全部按引用。从“所有”中排除的东西使用上面的简单规则。
完整的规则可以在优先选择上读取。
发布于 2017-10-18 12:19:03
简言之:
[]{ } // 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捕获。
[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,因为这是另一袋蠕虫。
[this]{ } // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure发布于 2017-10-18 12:18:55
r1,r2。没别的了。
&r1,&r2v1,按值计算的v2。没别的了。
v1,v2r1,r2。按价值休息。
=,&r1,&r2v1,按值计算的v2。参考休息。
&,v1,v2r1,r2,v1,v2。没别的了。
&r1,&r2,v1,v2https://stackoverflow.com/questions/46809901
复制相似问题