复合文字是标准 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(只是提到一个功能)
这是 gcc 和 clang
都支持的扩展。 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
后缀。
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(只是提到一个功能)
这是 gcc 和 clang
都支持的扩展。 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
后缀。