This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 116a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2024-12-19
[Voted into the WP at the June, 2008 meeting as part of paper N2672.]
C (both C90 and C99) appear to allow a declaration of the form
struct S { int i; } s = { { 5 } };
in which the initializer of a scalar member of an aggregate can itself be brace-enclosed. The relevant wording from the C99 Standard is found in 6.7.8 paragraph 11:
The initializer for a scalar shall be a single expression, optionally enclosed in braces.
and paragraph 16:
Otherwise, the initializer for an object that has aggregate or union type shall be a brace-enclosed list of initializers for the elements or named members.
The “list of initializers” in paragraph 16 must be a recursive reference to paragraph 11 (that's the only place that describes how an initialized item gets its value from the initializer expression), which would thus make the “brace-enclosed” part of paragraph 11 apply to each of the initializers in the list in paragraph 16 as well.
This appears to be an incompatibility between C and C++: 9.4.2 [dcl.init.aggr] paragraph 11 says,
If the initializer-list begins with a left brace, then the succeeding comma-separated list of initializer-clauses initializes the members of a subaggregate....
which clearly leaves the impression that only a subaggregate may be initialized by a brace-enclosed initializer-clause.
Either the specification in 9.4.2 [dcl.init.aggr] should be changed to allow a brace-enclosed initializer of a scalar member of an aggregate, as in C, or this incompatibility should be listed in Appendix Clause Annex C [diff].
Notes from the July, 2007 meeting:
It was noted that implementations differ in their handling of this construct; however, the issue is long-standing and fairly obscure.
Notes from the October, 2007 meeting:
The initializer-list proposal will resolve this issue when it is adopted.