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

Lor*_*ins 18 c++ compound-literals c++14

复合文字是C99结构.即使我可以用C++做到这一点:

#include <iostream>
using namespace std;

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

似乎MSVC支持它作为扩展.然而,我可以得到所有编译器,编译上面提到的代码.

是C++ 14中的一个功能吗?是否有一个不同的标准术语(在我看来,只是创建一个临时使用支撑初始化)?


旁注:"复合文字"(或者我应该称之为的任何内容)是包扩展上下文(仅提及功能)

Sha*_*our 24

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

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

如果你使用-pedantic构建,你应该收到一个警告,例如clang说(看到它):

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

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

在C++中,复合文字指定一个临时对象,该对象只存在于其完整表达式的末尾.因此,在C++中可以定义明确定义的C代码,该代码获取复合文字的子对象的地址.


T.C*_*.C. 24

(float[2]) {2.7, 3.1}
Run Code Online (Sandbox Code Playgroud)

是一个C99复合文字.一些编译器在C++中支持它作为扩展.

float[2] {2.7, 3.1}
Run Code Online (Sandbox Code Playgroud)

是语法错误.

鉴于using arr = float[2];,

arr {2.7, 3.1}
Run Code Online (Sandbox Code Playgroud)

是有效的C++列表初始化两个临时数组float.

{2.7, 3.1}
Run Code Online (Sandbox Code Playgroud)

被称为braced-init-list.

最后,为您的代码,

for (auto i : {2.7, 3.1}) cout << i << endl;
Run Code Online (Sandbox Code Playgroud)

同样有效,并且是完全有效的C++ - 这构建了一个std::initializer_list<double>引擎盖.如果您真的想要floats,请将f后缀添加到数字中.