Created on2011-04-18.00:00:00 last changed145 months ago
[Voted into the WP at the February, 2012 meeting;moved to DR at the October, 2012 meeting.]
Proposed resolution (August, 2011):
Change 9.5 [dcl.init] paragraph 7 as follows:
Tovalue-initialize an object of typeT means:
ifT is a (possibly cv-qualified) class type(Clause 11 [class]) witheither no defaultconstructor (11.4.5 [class.ctor]) or adefaultconstructor that is user-providedor 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);ifT is a (possibly cv-qualified) non-union class typewithout a user-providedor deleted default constructor,then the object is zero-initialized and, if
T'simplicitly-declared default constructor isT hasa non-trivialdefault constructor,thatconstructor is called.default-initialized;...
Change 9.5.5 [dcl.init.list] paragraph 3 as follows:
List-initialization of an object or reference of typeT isdefined as follows:
If the initializer list has no elements andTis a class type with a default constructor, the object isvalue-initialized.
Otherwise, ifIfT is anaggregate, 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 isvalue-initialized.
...
According to 9.5 [dcl.init] paragraph 7,
Tovalue-initialize an object of typeT means:
ifT 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);
ifT is a (possibly cv-qualified) non-union class typewithout a user-provided constructor, then the object iszero-initialized and, ifT's implicitly-declared defaultconstructor is non-trivial, that constructor is called.
ifT is an array type, then each element isvalue-initialized;
otherwise, the object is zero-initialized.
This suggests that for
struct A { A() = delete; }; union B { A a }; int main() { B(); }aB temporary is created and zero-initialized, even thoughits default constructor is deleted. We should strike "non-union" andalso the "if...non-trivial" condition, since we can have a trivialdeleted constructor.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2014-03-03 00:00:00 | admin | set | status: drwp -> cd3 |
| 2012-11-03 00:00:00 | admin | set | status: dr -> drwp |
| 2012-09-24 00:00:00 | admin | set | messages: +msg4006 |
| 2012-02-27 00:00:00 | admin | set | messages: +msg3815 |
| 2012-02-27 00:00:00 | admin | set | status: ready -> dr |
| 2011-04-18 00:00:00 | admin | create | |