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

Are compound literals Standard C++?

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 中可用的功能吗?是否有不同的标准术语(在我看来只是使用支撑初始化创建临时)?


旁注:"Compound Literals"(或者我应该称之为上面的任何东西)是一个pack expansion context(只是提到一个功能)

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

As an extension, GCC supports compound literals in C90 mode and in C++, though the semantics are somewhat different in C++.

如果您使用 -pedantic you should receive a warning, for example clang says (see it live):

warning: compound literals are a C99-specific feature [-Wc99-extensions]

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

In C++, a compound literal designates a temporary object, which only lives until the end of its full-expression. As a result, well-defined C code that takes the address of a subobject of a compound literal can be undefined in 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>。如果您真的想要 float,请在数字后添加 f 后缀。