[英]Are compound literals Standard C++?
这是gcc和clang
支持的扩展。 gcc文件说:
作为扩展,GCC在C90模式和C ++中支持复合文字,尽管C ++中的语义有些不同。
如果使用-pedantic进行构建,则应收到警告,例如clang
表示( 实时查看 ):
警告:复合文字是C99特定的功能[-Wc99-extensions]
请注意,C ++中的语义差异并不小,在C99中可以良好定义的代码在具有此扩展名的C ++中可能具有未定义的行为:
在C ++中,复合文字指定了一个临时对象,该对象仅生存到其完整表达式的结尾。 结果,定义良好的C语言代码(使用复合文字的子对象的地址)可能无法在C ++中定义。
(float[2]) {2.7, 3.1}
是C99复合文字。 一些编译器在C ++中将其作为扩展支持。
float[2] {2.7, 3.1}
是语法错误。
给定using arr = float[2];
,
arr {2.7, 3.1}
是有效的C ++,它对两个float
的临时数组进行列表初始化。
{2.7, 3.1}
被称为braced-init-list 。
最后,对于您的代码,
for (auto i : {2.7, 3.1}) cout << i << endl;
同样有效,并且是完全有效的C ++-这在std::initializer_list<double>
构造了一个std::initializer_list<double>
。 如果确实需要float
,则将f
后缀添加到数字中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.