cppcoreguidelines-misleading-capture-default-by-value

当 lambda 指定按值捕获默认值并捕获 this 时发出警告。

成员函数中的按值捕获默认值可能会误导用户判断数据成员是按值还是按引用捕获。这是因为指定捕获默认值 [=] 实际上是按值捕获 this 指针,而不是数据成员本身。因此,数据成员仍然通过捕获的 this 指针间接访问,这意味着它们实际上是通过引用访问的。所以,即使使用 [=],数据成员实际上也是按引用捕获的,这可能与用户的预期不符。

示例

struct AClass {
  int member;
  void misleadingLogic() {
    int local = 0;
    member = 0;
    auto f = [=]() mutable {
      local += 1;
      member += 1;
    };
    f();
    // Here, local is 0 but member is 1
  }

  void clearLogic() {
    int local = 0;
    member = 0;
    auto f = [this, local]() mutable {
      local += 1;
      member += 1;
    };
    f();
    // Here, local is 0 but member is 1
  }
};

此检查实现了 C++ 核心准则中的 F.54