Compound Literals are a C99 construct. Even though I can do this in C++ :
#include <iostream> using namespace std; int main() { for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl; }
It seems that for example MSVC supports it as an extension. Yet all compilers I can get my hands on, compile the above mentioned code.
So is this a feature available in C++14 ? Is there a different standard term (It looks to me like just creating a temporary using braced initialization) ?
Side Note : "Compound Literals" (or whatever I should call the above) are a pack expansion context ( just to mention a functionality )
In C, a compound literal designates an unnamed object with static or automatic storage duration. In C++, a compound literal designates a temporary object that only lives until the end of its full-expression.
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++, so the C++ compiler rejects the conversion of a temporary array to a pointer.
This is an extension that both gcc and clang
support. The gcc document says:
As an extension, GCC supports compound literals in C90 mode and in C++, though the semantics are somewhat different in C++.
if you build with -pedantic you should receive a warning, for example clang
says (see it live):
warning: compound literals are a C99-specific feature [-Wc99-extensions]
Note, the semantic differences in C++ are not minor and code that would be well-defined in C99 can have undefined behavior in C++ with this extension:
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++.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With