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 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.
union U { int a; mutable int b; };
constexpr U u1 = {1};
int k = (u1.b = 2);
constexpr U u2 = u1; // ok!!