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

Should I be worried about Wmissing-field-initializers and aggregate initialization in C++17?

我使用启用了 -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 中输出此警告的错误吗?看来我没有要初始化的字段,也没有遗漏的参数。

C++17 允许您使用基数 classes 在 classes 上执行聚合初始化。每个基数 class 都被有效地视为一个成员(它们位于 class 的直接成员之前)。所以聚合初始化,C有两个"members":C::AC::B.

你只初始化了一个

哦,当然,B 实际上没有任何要初始化的东西。但是对于-Wall来说,和这个没什么两样:

struct C
{
  A a;
  B b;
};

(void) C{1};

这也会给出警告。在任何一种情况下,您都可以通过为 B 提供显式初始化程序来使其静音:(void)C{1, {}};.

但就标准而言,这是完全有效的代码。 B 将被值初始化。无论哪种情况。