为什么在 C++11 中编译了指示符初始化?

Why is designator initialization compiled in c++11?

如果我没理解错的话,文章https://en.cppreference.com/w/cpp/language/aggregate_initialization说指定初始化从c++20开始是允许的,c++11是不允许的。

那么为什么下面的代码是用c++11编译的呢? g++ -std=c++11 main.cpp

struct A { int x; int y; int z; };

int main(int argc, char const *argv[])
{
    A b{.x = 1, .z = 2};
    return 0;
}

我的第一个猜测是有某种支持它的 gcc 扩展,但 clang 也编译了这段代码 (clang -std=c++11 main.cpp)

Why is designator initialization compiled in c++11?

该程序在 C++11 中是 ill-formed。 C++ 语言不会禁止 ill-formed 程序编译。

My first guess was that there is some kind of gcc extension that supports it, but clang compile this code as well

你的第一个猜测是好的,你可以简单地展开它来得出答案:该语言由 GCC 和 Clang 扩展。 Clang 经常尝试尽可能与 GCC 兼容。好与坏。