Compound Literals是C99构造。即使我可以在C ++中做到这一点:
#include <iostream>
using namespace std;
int main() {
for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl;
}
例如,似乎MSVC支持它as an extension。但是,我可以投入使用的所有编译器都可以编译上述代码。
那么,此功能在C ++ 14中可用吗?是否有一个不同的标准术语(在我看来,这就像使用支撑初始化创建一个临时目录一样)?
旁注:“复合文字”(或上面我所说的任何东西)是pack expansion context(仅提及功能)
最佳答案
这是gcc和clang
都支持的扩展。 gcc文件说:
作为扩展,GCC在C90模式和C ++中支持复合文字,尽管C ++中的语义有些不同。
如果使用-pedantic构建,则应该收到警告,例如clang
说(see it live):
警告:复合文字是C99特定的功能[-Wc99-extensions]
请注意,C ++中的语义差异并不小,在此扩展中,本应在C99中良好定义的代码在C ++中可能具有未定义的行为:
在C ++中,复合文字表示一个临时对象,该对象仅
一直活到完全表达的结尾。结果,定义明确
接受复合文字的子对象地址的C代码可以
在C ++中未定义。