我应该担心 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::A
和C::B
.
你只初始化了一个
哦,当然,B
实际上没有任何要初始化的东西。但是对于-Wall
来说,和这个没什么两样:
struct C
{
A a;
B b;
};
(void) C{1};
这也会给出警告。在任何一种情况下,您都可以通过为 B
提供显式初始化程序来使其静音:(void)C{1, {}};
.
但就标准而言,这是完全有效的代码。 B
将被值初始化。无论哪种情况。
我使用启用了 -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::A
和C::B
.
你只初始化了一个
哦,当然,B
实际上没有任何要初始化的东西。但是对于-Wall
来说,和这个没什么两样:
struct C
{
A a;
B b;
};
(void) C{1};
这也会给出警告。在任何一种情况下,您都可以通过为 B
提供显式初始化程序来使其静音:(void)C{1, {}};
.
但就标准而言,这是完全有效的代码。 B
将被值初始化。无论哪种情况。