【发布时间】:2021-08-07 19:25:22
【问题描述】:
我有一个聚合结构 B 派生自另一个聚合 A。我想初始化它,有两种选择:普通聚合初始化和C++20指定初始化器:
struct A {};
struct B : A { int x; };
int main() {
[[maybe_unused]] B x{{},1}; //ok everywhere
[[maybe_unused]] B y{.x=1}; //warning in GCC
}
普通的初始化{{},1} 工作正常,但在这种情况下看起来太笨拙了,因为父聚合有额外的{}。
在我看来,指定的初始化器 {.x=1} 看起来更好,但它们在 GCC 中会产生一个奇怪的警告:
warning: missing initializer for member 'B::<anonymous>' [-Wmissing-field-initializers]
6 | [[maybe_unused]] B y{.x=1}; //warning in GCC
| ^
演示:https://gcc.godbolt.org/z/8jEYY16c6
有没有办法在这里使用指定的初始化器,同时让GCC冷静下来,消除警告?
【问题讨论】:
-
在 MSVC 中对于指定的初始化程序也看不到这个警告(那是
/W4和我喜欢启用的许多其他开关...... -
看起来像一个 GCC 错误 stackoverflow.com/questions/49081541 该目标是针对 C 的,但我认为 GCC 对 C++20 指定的初始值设定项使用相同的机制,因此会发出警告。
标签: c++ c++20 designated-initializer