7

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

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 中用于输出此警告的错误吗?似乎我没有要初始化的字段,也没有缺少参数。

4

1 回答 1

8

C++17 允许您对具有基类的类执行聚合初始化。每个基类都被有效地视为一个成员(它们位于类的直接成员之前)。所以要聚合初始化,C有两个“成员”:C::AC::B.

你只初始化了一个。

哦,当然,B实际上没有任何东西要初始化。但是 to -Wall,它与此没有什么不同:

struct C
{
  A a;
  B b;
};

(void) C{1};

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

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

于 2017-12-10T06:13:56.450 回答