我是否应该担心C 17中的Wmissing-Field-Initializer和汇总初始化

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

本文关键字:Wmissing-Field-Initializer 初始化 中的 是否 担心      更新时间:2023-10-16

我用 -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允许您在基础类的类上执行汇总初始化。每个基类有效地将成员视为成员(它们是在班级的直接成员面前)。因此,要汇总初始化,C有两个"成员":C::AC::B

您只初始化一个。

哦,肯定的是,B实际上没有任何初始化。但是对于-Wall,它与此不同:

struct C
{
  A a;
  B b;
};
(void) C{1};

这也会发出警告。无论哪种情况,您都会通过为B(void)C{1, {}};

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