我认为指定的初始值设定项在C ++中已终止,仅在C语言中有效。但是,我遇到了一个简单的示例,该示例在clang ++中进行了编译并可以很好地工作。
f(int, float)
g ++:https://rextester.com/AXIZ79197(错误)
clang ++:https://rextester.com/UYVHHP56966(有效)
vc ++:https://rextester.com/UCBEU10658(错误)
g ++和vc ++均无法编译,而clang ++正常运行。还值得一提的是g ++和vc ++给出了不同的错误消息。 vc ++将指定的初始化程序与lambda表达式混淆了。我想我可以将此归咎于g ++是较旧的编译器,但我不确定tbh。
问题:
答案 0 :(得分:6)
使用-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 };
很明显,clang++
默认情况下启用c99-extensions
。
这不是错误,因为编译器可能选择提供其他功能。 clang++
开发人员只是决定保持启用状态。如果我们不希望使用这些功能,最好使用-pedantic
。
有趣的是,在搜索相关信息时,我来到C++ Support in Clang页面,其中列出了“指定的初始值设定项”,并通过扩展提供了对即将推出的提案的支持:
对C ++ 17之后临时命名为C ++ 2a的C ++标准的某些提议功能的实验支持
This是即将发布的标准的确切建议。因此,将来的C ++中可能会指定初始化器。