首页 > 解决方案 > c ++聚合初始化程序g ++错误?

问题描述

我在用 g++ 编译这个名为初始化的简单聚合时遇到问题

struct A  {
    int a;
};
struct B {
    int b;
};
struct C {
    A a;
    B b;
};

void fun() {
    A a{0};
    B b {12} ;
    // g++ is OK with this
    C c{  .a=a , .b=b };
    // g++ is OK with this
    C cc{ 0, {12}};
    // msvc, clang accept this but g++ does not
    C ccc{.a=0, .b={12}};
}

g++ 抱怨error: 'A' has no non-static data member named 'b

这是一个 gcc 错误吗?

标签: c++c++20aggregate-initialization

解决方案


相反,这是一个其他人的错误(我提交了llvm 错误 #49020,Richard Smith 已经在主干上修复了该错误)。gcc 拒绝是正确的(尽管错误没有意义。A确实没有命名的非静态数据成员b,但这不是问题......)

这个:

C ccc{.a=0, .b={12}};

应该是不正确的。这意味着您正在初始化with的a成员和Cwith=0b成员。C={12}

但是您不能初始化Afrom = 0。这是格式错误的:

A a = 0;

因此,更广泛的初始化也是格式错误的。我不知道为什么其他人都接受。


推荐阅读