Created on 2014-09-16.00:00:00 last changed 94 months ago
[Moved to DR at the October, 2015 meeting.]
Proposed resolution (May, 2015):
Add the following bullet after bullet 3.1 of 9.2.6 [dcl.constexpr]:
The definition of a constexpr function shall satisfy the following constraints:
it shall not be virtual (11.7.3 [class.virtual]);
for a defaulted copy/move assignment, the class of which it is a member shall not have a mutable subobject that is a variant member;
...
Add the following bullet after bullet 4.1 of 9.2.6 [dcl.constexpr]
The definition of a constexpr constructor shall satisfy the following constraints:
the class shall not have any virtual base classes;
for a defaulted copy/move constructor, the class shall not have a mutable subobject that is a variant member;
...
In an example like
union U { int a; mutable int b; };
constexpr U u1 = {1};
int k = (u1.b = 2);
constexpr U u2 = u1; // ok!!
The initialization of u2 is not disqualified by the current wording of the Standard because the copy is done via the object representation, not formally involving an lvalue-to-rvalue conversion. A restriction should be added to 7.7 [expr.const] forbidding the evaluation of a defaulted copy/move construction/assignment on a class type that has any variant mutable subobjects.
History | |||
---|---|---|---|
Date | User | Action | Args |
2017-02-06 00:00:00 | admin | set | status: dr -> cd4 |
2015-11-10 00:00:00 | admin | set | messages: + msg6069 |
2015-11-10 00:00:00 | admin | set | status: ready -> dr |
2015-05-25 00:00:00 | admin | set | messages: + msg5450 |
2015-05-25 00:00:00 | admin | set | status: drafting -> ready |
2014-09-16 00:00:00 | admin | create |