我应该担心C ++ 17中的Wmissing-field-initializers和聚合初始化吗?

时间:2017-12-10 05:51:10

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

我使用启用了-Wall-Wextra的GCC编译了一些代码。此代码生成警告:

struct A { A(int) {} };
struct B {};

struct C : A, B {};

int main() {
    (void) C{1};
}
main.cpp: In function 'int main()':
main.cpp:11:15: warning: missing initializer for member 'C::<anonymous>' [-Wmissing-field-initializers]
     (void) C{1};
               ^

我应该担心吗?这是GCC输出此警告的错误吗?我似乎没有要初始化的字段,也没有遗漏参数。

1 个答案:

答案 0 :(得分:7)

C ++ 17允许您对具有基类的类执行聚合初始化。每个基类都被有效地视为成员(它们位于类的直接成员之前)。因此,为了聚合初始化,C有两个&#34;成员&#34;:C::AC::B

您只初始化了一个。

哦,确定,B实际上没有任何内容可以初始化。但对于-Wall,它与此没有什么不同:

struct C
{
  A a;
  B b;
};

(void) C{1};

这也会发出警告。您可以通过为B (void)C{1, {}};提供明确的初始值设定项来沉默它。

但就标准而言,这是完全有效的代码。 B将初始化值。在任何一种情况下。