正如论文P0409R2中提出的
我期望 x 的定义从 C++20 中被弃用并且无法编译,但它似乎可以在 g++ (GCC) 8.1.0 中工作,有谁知道我是否做错了什么?
在 Visual Studio 2017 中,编译器失败,并在 y 的定义周围出现错误。错误 C3791:当默认捕获模式为复制 (=) 时,无法显式捕获“this”
#include <iostream>
struct X {
void f()
{
int value = 3;
auto x = [=] { // Deprecated from C++20:
return value + g();
};
auto y = [=, this] { // Recommended method from C++20:
return value + g(); // [=] The this pointer will not be captured, so capture with specifying this
};
}
int g() const
{
return 2;
}
};
int main()
{
X().f();
}
Run Code Online (Sandbox Code Playgroud)
提案并不意味着被采纳。也就是说,通读措辞和示例,它指出:
[=, this]{ }; // OK, equivalent to [=]
Run Code Online (Sandbox Code Playgroud)
这似乎表明这x是允许的。我也没有看到明确提及此功能已被弃用。甚至还提到了相反的情况:
在接下来的调查中我们不会考虑弃用,因为我们只对探索长期方向感兴趣,没有方向的弃用并不是那么有趣。
首先,这只是一个提案,并不自动意味着它将成为标准的一部分。其次,C++20 仍在开发中。
现在,即使该提案在 C++20 中被采用并且编译器实现了它,它也明确表示它并不建议弃用旧方法:
在接下来的调查中我们不会考虑弃用,因为我们只对探索长期方向感兴趣,没有方向的弃用并不是那么有趣。
好吧,看起来它确实会在 C++20 中被弃用。但同样,由于 C++20 标准尚未最终确定,编译器正在不断实现它,因此 gcc 尚未实现这一点。
至于VS,看起来2017版本还没有实现C++17按值捕获。