【发布时间】:2021-10-11 16:27:38
【问题描述】:
在下面的程序中,聚合结构B 具有字段a,它本身就是一个聚合。是否可以使用 C++20 指定初始化器来设置其值而不用大括号括起来?
struct A { int i; };
struct B { A a; };
int main() {
[[maybe_unused]] B x{1}; //ok everywhere
[[maybe_unused]] B y{.a = {1}}; //ok everywhere
[[maybe_unused]] B z{.a = 1}; //ok in MSVC,Clang; error in GCC
}
MSVC 和 Clang 编译器接受此代码。但是 GCC 发出一个奇怪的错误:
error: 'A' has no non-static data member named 'a'
演示:https://gcc.godbolt.org/z/65j1sTcPG
这是 GCC 中的错误,还是标准不允许这种初始化?
【问题讨论】:
-
这个错误看起来怪怪的,但我希望拒绝第三个是正确的。它看起来很像
A a = 1;(我敢肯定他们都会拒绝)。 -
也许它像
B z {{.a = 1}};一样解析它? -
@NateEldredge 这很有意义!
标签: c++ c++20 designated-initializer