Title
Empty aggregate initializer for union
Status
c++17
Section
9.4.2 [dcl.init.aggr]
Submitter
Daveed Vandevoorde

Created on 2013-02-14.00:00:00 last changed 80 months ago

Messages

Date: 2017-02-15.00:00:00

Proposed resolution (February, 2017):

The resolution of issue 2272 also resolves this issue.

Date: 2016-11-15.00:00:00

Proposed resolution (November, 2016) [SUPERSEDED]:

Change 9.4.2 [dcl.init.aggr] paragraph 8 as follows:

If there are fewer initializer-clauses in the list than there are elements in the aggregate, then each Each non-variant element of the aggregate that is not explicitly initialized shall be is initialized from its default member initializer (11.4 [class.mem]) or, if there is no default member initializer, copy-initialized from an empty initializer list (9.4.5 [dcl.init.list]). If the aggregate is a union and the initializer list is empty, then

  • if any union member has a default member initilizer, that member is initialized from its default member initializer;

  • otherwise, the first member of the union (if any) is copy-initialized from an empty initializer list.

[Example:...

Date: 2017-02-15.00:00:00

[Adopted at the February/March, 2017 meeting.]

According to 9.4.2 [dcl.init.aggr] paragraph 15,

When a union is initialized with a brace-enclosed initializer, the braces shall only contain an initializer-clause for the first non-static data member of the union.

This would appear to preclude using {} as the initializer for a union, which would otherwise have reasonable semantics. Is there a reason for this restriction?

Also, paragraph 7 reads,

If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member not explicitly initialized shall be initialized from an empty initializer list (9.4.5 [dcl.init.list]).

There should presumably be special treatment for unions, so that only a single member is initialized in such cases.

(See also issue 1460.)

History
Date User Action Args
2018-02-27 00:00:00adminsetmessages: + msg6163
2018-02-27 00:00:00adminsetstatus: ready -> c++17
2017-02-06 00:00:00adminsetmessages: + msg5717
2017-02-06 00:00:00adminsetstatus: drafting -> ready
2013-05-03 00:00:00adminsetstatus: open -> drafting
2013-02-14 00:00:00admincreate