我总是对lambda捕获感到困惑,我不知道变量是通过引用还是通过值捕获的。例如,如果我有[a]
,我不知道a
是按值还是通过参考来捕获。
我认为一个简单的方法就是通过例子。因此,让每个案例都有一个案例(如果有更多表达同一事物的方式,则更多):
捕获:
r1
,r2
仅供参考。没别了。v1
,v2
按值计算。没别了。r1
,r2
仅供参考。按价值休息。v1
,v2
按值计算。以参考为基础。r1
,r2
引用,v1
,v2
按值。没别了。让我们完全忽略this
因为那是另一包蠕虫。
答案 0 :(得分:10)
简而言之:
[]{ } // 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捕获来实现某种“完美转发捕获”:"capturing perfectly-forwarded objects in lambdas"。
让我们完全忽略
this
因为那是另一包蠕虫。
[this]{ } // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure
[*this]
was introduced in C++17。
请注意,[&this]
为a syntax error。
答案 1 :(得分: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] |
规则很简单:前面有&
,按引用捕获。仅限名称,按值捕获。
默认值:=
全部按值,&
全部按引用。要从"所有"中排除的东西使用上面的简单规则。
可以在cppreference上阅读完整规则。
答案 2 :(得分:2)
没有
[]
全部通过引用
[&]
全部按值
[=]
r1
,r2
仅供参考。没别了。
[&r1, &r2]
v1
,v2
按值计算。没别了。
[v1, v2]
r1
,r2
仅供参考。以价值休息。
[=, &r1, &r2]
v1
,v2
按值计算。以参考为基础。
[&, v1, v2]
r1
,r2
按引用,v1
,v2
按值。没别了。
[&r1, &r2, v1, v2]