为什么Clang决定允许在C++中使用指定的初始值设定项?

Con*_*nos 2 c++ arrays designated-initializer

我认为指定的初始化程序在C++中已经停止,并且仅在C中工作.但是,我遇到了一个简单的例子,它使用clang ++进行编译和工作.

int main()
{
    int a[6] = { [4] = 29, [2] = 15 };
}
Run Code Online (Sandbox Code Playgroud)

g ++:https://rextester.com/AXIZ79197(错误)

clang ++:https://rextester.com/UYVHHP56966(作品)

vc ++:https://rextester.com/UCBEU10658(错误)

g ++和vc ++都无法编译,而clang ++工作正常.值得一提的是,g ++和vc ++给出了不同的错误消息.vc ++将指定的初始值设定项与lambda表达式混淆.我想我可以将此归结为g ++是一个较旧的编译器,但我不确定.

问题:

  1. 当g ++和vc ++没有时,为什么clang决定允许指定的初始值设定项?
  2. 这只是一个编译器错误还是有另一个原因?

tas*_*oor 7

编译时-pedantic会生成以下警告:

source_file.cpp:3:18: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };
                 ^~~~~~~~
source_file.cpp:3:28: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };
Run Code Online (Sandbox Code Playgroud)

很明显,clang++默认情况下启用c99-extensions.

这不是错误,因为编译器可能会选择提供其他功能.clang++开发人员只是决定保持启用它.-pedantic如果我们不想要这些功能,最好使用它.

有趣的是,在搜索相关信息时,我在Clang页面中找到了C++支持,其中"指定初始化程序"被列为部分支持,通过扩展即将发布的提案:

对C++ 17之后的C++标准的一些提议特征的实验支持,临时命名为C++ 2a

是即将推出的标准的确切提案.因此在将来的C++中可能会有指定的初始值设定项.