30

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

#include <iostream>
using namespace std;

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

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

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


旁注:“复合文字”(或我应该在上面调用的任何内容)是包扩展上下文(仅提及功能)

4

2 回答 2

34

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

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

如果您使用-pedantic构建,您应该会收到警告,例如clang说(实时查看):

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

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

在 C++ 中,复合字面量表示一个临时对象,该对象只存在到其完整表达式的末尾。因此,可以在 C++ 中未定义采用复合文字的子对象地址的定义良好的 C 代码。

于 2015-01-23T18:37:37.610 回答
32
(float[2]) {2.7, 3.1}

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

float[2] {2.7, 3.1}

是语法错误。

给定using arr = float[2];

arr {2.7, 3.1}

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

{2.7, 3.1}

称为花括号初始化列表

最后,对于您的代码,

for (auto i : {2.7, 3.1}) cout << i << endl;

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

于 2015-01-23T18:51:03.957 回答