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(仅提及功能)

最佳答案

这是gccclang都支持的扩展。 gcc文件说:


  作为扩展,GCC在C90模式和C ++中支持复合文字,尽管C ++中的语义有些不同。


如果使用-pedantic构建,则应该收到警告,例如clang说(see it live):


  警告:复合文字是C99特定的功能[-Wc99-extensions]


请注意,C ++中的语义差异并不小,在此扩展中,本应在C99中良好定义的代码在C ++中可能具有未定义的行为:


  在C ++中,复合文字表示一个临时对象,该对象仅
  一直活到完全表达的结尾。结果,定义明确
  接受复合文字的子对象地址的C代码可以
  在C ++中未定义。

08-17 03:23