C++20 中已弃用的 lambda 捕获

Dam*_*ian 5 c++ c++20

正如论文P0409R2中提出的

我期望 x 的定义从 C++20 中被弃用并且无法编译,但它似乎可以在 g++ (GCC) 8.1.0 中工作,有谁知道我是否做错了什么?

在 Visual Studio 2017 中,编译器失败,并在 y 的定义周围出现错误。错误 C3791:当默认捕获模式为复制 (=) 时,无法显式捕获“this”

Live Code

#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)

JVA*_*pen 6

提案并不意味着被采纳。也就是说,通读措辞和示例,它指出:

 [=, this]{ };      // OK, equivalent to [=]
Run Code Online (Sandbox Code Playgroud)

这似乎表明这x是允许的。我也没有看到明确提及此功能已被弃用。甚至还提到了相反的情况:

在接下来的调查中我们不会考虑弃用,因为我们只对探索长期方向感兴趣,没有方向的弃用并不是那么有趣。


bol*_*lov 2

首先,这只是一个提案,并不自动意味着它将成为标准的一部分。其次,C++20 仍在开发中。

现在,即使该提案在 C++20 中被采用并且编译器实现了它,它也明确表示它并不建议弃用旧方法:

在接下来的调查中我们不会考虑弃用,因为我们只对探索长期方向感兴趣,没有方向的弃用并不是那么有趣。

好吧,看起来它确实会在 C++20 中被弃用。但同样,由于 C++20 标准尚未最终确定,编译器正在不断实现它,因此 gcc 尚未实现这一点。

至于VS,看起来2017版本还没有实现C++17按值捕获。

  • 不推荐使用“[=]”隐式捕获“this”。请参阅[\[depr.capture.this\]](http://eel.is/c++draft/depr#capture.this)。(我建议阅读整个附件,看看 C++20 中弃用了多少内容。) (2认同)