繁体   English   中英

复合文字是标准C ++吗?

[英]Are compound literals Standard C++?

复合文字是C99构建体。 即使我可以在C ++中做到这一点:

#include <iostream>
using namespace std;

int main() {
    for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl;
}

似乎MSVC例如支持它作为扩展 但是,我可以投入使用的所有编译器都可以编译上述代码。

那么,此功能在C ++ 14中可用吗? 是否有一个不同的标准术语(在我看来,这就像使用支撑初始化创建一个临时目录一样)?


旁注 :“复合文字”(或上面我所说的任何东西)是包扩展上下文 (仅提及功能)

这是gccclang支持的扩展。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM