This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 119a. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.
2025-12-20
[Adopted at the February/March, 2017 meeting.]
Issue 2004 concerns this example:
union U { int a; mutable int b; }; constexpr U u1 = {1}; int k = (u1.b = 2); constexpr U u2 = u1;Clearly this must be ill-formed. But issue 2004 goes too farby making the copy and move operations ofU non-constexpr.This breaks reasonable code such as:
constexpr int f() { U u = {1}; U v = u; return v.a; }Proposed resolution (February, 2017):
Add the following as a new bullet following7.7 [expr.const] bullet 2.8
Aconditional-expressione is acore constantexpression unless the evaluation ofe , following the rules ofthe abstract machine (6.10.1 [intro.execution]), would evaluate one of thefollowing expressions:
...
an lvalue-to-rvalue conversion (7.3.2 [conv.lval]) that isapplied to a glvalue that refers to a non-active member of a union or asubobject thereof;
an invocation of an implicitly-defined copy/move constructoror copy/move assignment operator for a union whose active member (if any)is mutable, unless the lifetime of the union object began within theevaluation ofe;
...
Delete bullet 3.2 in 9.2.6 [dcl.constexpr]:
for a defaulted copy/move assignment, the class of which itis a member shall not have a mutable subobject that is a variantmember;
Delete bullet 4.2 in 9.2.6 [dcl.constexpr]:
for a defaulted copy/move constructor, the class shall nothave a mutable subobject that is a variant member;