CWG Issue 1301 (original) (raw)
This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 118e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-11-05
1301. Value initialization of union
Section: 9.5 [dcl.init]Status: CD3Submitter: Jason MerrillDate: 2011-04-18
[Voted into the WP at the February, 2012 meeting; moved to DR at the October, 2012 meeting.]
According to 9.5 [dcl.init] paragraph 7,
To value-initialize an object of type T means:
- if T is a (possibly cv-qualified) class type (Clause 11 [class]) with a user-provided constructor (11.4.5 [class.ctor]), then the default constructor forT is called (and the initialization is ill-formed ifT has no accessible default constructor);
- if T is a (possibly cv-qualified) non-union class type without a user-provided constructor, then the object is zero-initialized and, if T's implicitly-declared default constructor is non-trivial, that constructor is called.
- if T is an array type, then each element is value-initialized;
- otherwise, the object is zero-initialized.
This suggests that for
struct A { A() = delete; }; union B { A a }; int main() { B(); }
a B temporary is created and zero-initialized, even though its default constructor is deleted. We should strike "non-union" and also the "if...non-trivial" condition, since we can have a trivial deleted constructor.
Proposed resolution (August, 2011):
- Change 9.5 [dcl.init] paragraph 7 as follows:
To value-initialize an object of type T means:
- if T is a (possibly cv-qualified) class type (Clause 11 [class]) with either no default constructor (11.4.5 [class.ctor]) or a default constructor that is user-provided or deleted
constructor (11.4.5 [class.ctor]), then theobject is default-initializeddefault constructor forT is called (and the initialization is ill-formed ifT has no accessible default constructor);- if T is a (possibly cv-qualified) non-union class type without a user-provided or deleted default constructor, then the object is zero-initialized and, if
T's implicitly-declared default constructor isT has a non-trivial default constructor,that constructor is called.default-initialized;- ...
- Change 9.5.5 [dcl.init.list] paragraph 3 as follows:
List-initialization of an object or reference of type T is defined as follows:
If the initializer list has no elements and Tis a class type with a default constructor, the object is value-initialized.Otherwise, ifIf T is an aggregate, aggregate initialization is performed (9.5.2 [dcl.init.aggr]). [Example:...- Otherwise, if the initializer list has no elements andT is a class type with a default constructor, the object is value-initialized.
- ...