Lambda Captures
Lambda Captures
我总是对lambda捕获感到困惑,我不知道变量是通过引用还是值捕获的。例如,如果我有[a]
我不知道a
是由值还是由引用捕获的。
我认为获得它的简单方法是通过示例。因此,让我们为每个情况提供一个(如果有更多表达相同事物的方式,则更多):
捕获:
- 无
- 全部通过参考
- 全部按价值
-
r1
,r2
引用。没有别的。 -
v1
,按值v2
。没有别的。 -
r1
,r2
引用。按值休息。 -
v1
,按值v2
。其余按参考。 -
r1
,按引用r2
,v1
,v2
按值。没有别的。
让我们完全忽略this
因为那是另一袋蠕虫。
简而言之:
[]{ } // 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 捕获来实现某种"完美转发捕获":"捕获 lambda 中完美转发的对象"。
让我们完全忽略
this
因为那是另一袋蠕虫。
[this]{ } // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure
[*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] |
规则很简单:前面有一个&
,通过引用捕获。仅名称,按值捕获。
默认值:按值=
全部,&
按引用全部。要从"全部"中排除的内容使用上面的简单规则。
完整的规则可以在cpp首选项上阅读。
-
无
[]
-
全部通过参考
[&]
-
全部按价值
[=]
-
r1
,r2
引用。没有别的。[&r1, &r2]
-
v1
,按值v2
。没有别的。[v1, v2]
-
r1
,r2
引用。按值休息。[=, &r1, &r2]
-
v1
,按值v2
。其余按参考。[&, v1, v2]
-
r1
,按引用r2
,v1
,v2
按值。没有别的。[&r1, &r2, v1, v2]
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- Lambda Captures
- Lambda Captures C++14