在默认的初始化程序gcc vs clang中使用lambda

Ori*_*ent 18 c++ lambda member-initialization language-lawyer c++14

#include <cassert>
#include <cmath>

int main()
{
    struct point_of_cone
    {
        double x, y;
        double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
    };
    point_of_cone p = {3.0, 4.0};
    assert(p.z == 5.0);
}
Run Code Online (Sandbox Code Playgroud)

适用于clang++来自中继的工作正常,但是g++从中继失败并出现错误消息(链接):

错误:没有为此lambda函数捕获'this'

point_of_conein namespace范围的定义适用于两者.

使用[this]lambda捕获进行略微修改的定义也适用于全局或局部范围.

哪个编译器是对的?

Col*_*mbo 11

这是一个gcc bug.

int main() {
    struct A {
        int x, i = [&] { return x; }();
    } a{0};
}
Run Code Online (Sandbox Code Playgroud)

这失败了,但如果我们......

  • 更改&this,或
  • 声明A具有命名空间范围,

有用.但是,这些都不会对良好形成产生任何影响.

报道:#78019.

  • @Griwes你能用这种矛盾来推断这不是你徘徊的错误吗?:-) (2认同)