为什么联合体的指定初始化器在 C++11 中起作用?
根据文档,这是 C++20 功能 https://en.cppreference.com/w/cpp/language/aggregate_initialization
union u { int a; const char* b; };
// C++20 designated initializer lists
u d = {.b = "asdf"}; // OK: can explicitly initialize a non-initial member
但是我可以编译这个
❯ cat union.cc
union U{
int a;
float b;
};
int main(){
auto u = U{.a=3};
return 0;
}
~/code/des_init
❯ gcc ./union.cc -std=c++11
C 在语言中添加了指定的初始值设定项。 许多 C++ 编译器用 C 实现它,并且在非严格一致性模式下允许 C++ 程序使用该功能。
后来它被添加到 C++ 中,但有一些限制(例如要求按顺序执行初始化程序)。
告诉您的编译器使用严格一致性来阻止默认包含的语言的部分或全部扩展。
-pedantic
和 -Werror
和/或 -pedantic-errors
都是阻止各种扩展程序的方法。
有人从 C 的角度谈论这个问题,请参阅如何禁用 GNU C 扩展?;许多相同的标志在 C++ 中工作。
gcc 默认情况下会尝试编译有效的程序,但不保证拒绝所有无效的程序。