C++编程规范:避免使用 [=] 默认捕获
发表时间: 2024-05-13 15:47
这是 C++ 核心指南中的一条规则,关于规则 F.54 的更多细节,请参见 C++ 核心指南页面。
原因:这会造成混淆。在成员函数中使用 [=] 看似是值捕获,但实际上是通过引用捕获数据成员,因为它实际上是通过值捕获了不可见的 this 指针。如果你有意这么做,请明确写出 this。
示例:
class My_class { int x = 0; // ... void f() { int i = 0; // ... auto lambda = [=] { use(i, x); }; // BAD: "looks like" copy/value capture // [&] has identical semantics and copies the this pointer under the current rules // [=,this] and [&,this] are not much better, and confusing x = 42; lambda(); // calls use(0, 42); x = 43; lambda(); // calls use(0, 43); // ... auto lambda2 = [i, this] { use(i, x); }; // ok, most explicit and least confusing // ... }};
注意:如果你打算捕获所有类数据成员的副本,请考虑使用 C++17 的 [*this]。
执行:标记任何指定了 [=] 捕获列表默认捕获,并且也捕获了 this(无论是显式捕获还是通过默认捕获并在函数体内使用了 this)的 lambda 表达式。