为什么 lambda 函数需要在 c++20 中显式捕获 [this] 指针?

Tro*_*yvs 7 c++ lambda this capture c++20

在 c++20 之前,this指针以 [=] 隐式捕获。那么,c++20 决定用户应该编写 [=, this] 来显式捕获此指针的原因是什么,我的意思是,如果没有这种更改,c++20 之前的代码可能会有任何代码味道或潜在的错误?

这种语言更改有什么好的示例或原因吗?

Bar*_*rry 15

这在P0806中有解释,正如标题所说,“Deprecate[d] 隐式捕获thisvia [=]

论文中的论点是,此时我们有[this](捕获this指针)和[*this](捕获对象本身),以及[&](通过引用捕获对象,这基本上是this通过值捕获指针)。因此,是否[=]应该意味着[this]或可能是含糊不清的[*this],并且可能令人惊讶的是,它意味着前者(因为[=]在这种情况下充当参考捕获)。

因此,您必须编写[=, this][=, *this],具体取决于您实际想要的两者之一。


顺便说一句,该论文声称的内容毫无价值:

此更改不会破坏其他有效的 C++20 代码

然而,如果您-Werror像许多人一样在启用警告的情况下进行编译(并且应该这样做,除非您有令人信服的理由不这样做 - 确实有),这一更改当然会破坏许多其他有效的 C++20 代码。