One can create an anonymous object that is initialized through constructor parameters, such as in the return statement, below.
struct S {
S(int i_, int j_) : i(i_), j(j_) { }
int i, j;
};
S f()
{
return S(52, 100);
}
int main()
{
cout << f().i << endl;
return 0;
}
However, can one similarly create an anonymous aggregate that is initialized with a brace initializer? For example, can one collapse the body of f(), below, down to a single return statement without an "s?"
struct S {
int i, j;
};
S f()
{
S s = { 52, 100 };
return s;
}
int main()
{
cout << f().i << endl;
return 0;
}
You can't in the current version of C++. You will be able to in C++ 0x -- I believe anyway. Of course, it's still open to revision -- at one time I believed you'd be able to specify concepts in C++ 0x, but that's gone...
Edit: The reference would be [dcl.init] (§8.5/1) in N2960. The most relevant bit is the definition of 'braced-init-list' in the BNF (and the last bit of text, saying that the initialization described in that section can/does apply to return values).
Not in C++. But you can in C99, using so-called compound literals:
struct S {
int i, j;
};
struct S F()
{
// Valid C99, invalid C++:
return (struct S){ 52, 100 };
}
[C99: §6.5.2, 6.5.2.5]
[C++98: §5.2.3, 8.5, 12.1, 12.2]
Some C++ compilers provide this as an extension, but it's not legal ISO C++98. For example, g++ will accept this code by default, but if you compile with the -pedantic
option, it will reject it.
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