ISO/IEC JTC1/SC22/WG14 N730 Cleanup of aggregate initialization Clive D.W. Feather Abstract ======== The compound literals proposal - N716 - innocently introduces an inconsistency in aggregate initialization. No-one has given a rationale for it, and this paper proposes that it be removed. Discussion ========== Consider the following code: struct s { int a; int b; }; int x = 1, y = 2; struct s sx; int main (void) { sx.a = 3; sx.b = 4; { int z = x; // Valid struct s s1 = sx; // Valid struct s s2 = (struct s) { x, y }; // Valid struct s s3 = { x, y }; // Forbidden /* ... */ } } There is no semantic difference between the declarations of s2 and s3, yet the latter is forbidden by 6.5.7 paragraph 4: All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions. It has been suggested that the original constraint was to allow for implementations where the dynamic initializer would have been a burden. Since such implementations now have to cope with compound literals and the declaration of s2, the restriction has outlived its usefulness. Proposal ======== Change 6.5.7 paragraph 4 from: All the expressions in an initializer for an object that has static storage duration or in an initializer list for an object that has aggregate or union type shall be constant expressions. to: All the expressions in an initializer for an object that has | static storage duration shall be constant expressions.