Title
Unions should not require a non-static data member of literal type
Status
tentatively ready
Section
6.8.1 [basic.types.general]
Submitter
Richard Smith

Created on 2022-06-18.00:00:00 last changed 1 month ago

Messages

Date: 2022-09-25.18:08:42

Proposed resolution (CWG telecon 2022-08-12):

Change in 6.8.1 [basic.types.general] paragraph 10 as follows:

A type is a literal type if it is:
  • ...
  • a possibly cv-qualified class type (Clause 11 [class]) that has all of the following properties:
    • it has a constexpr destructor (9.2.6 [dcl.constexpr]),
    • all of its non-static non-variant data members and base classes are of non-volatile literal types, and
    • it is either
      • is a closure type (7.5.5.2 [expr.prim.lambda.closure]),
      • is an aggregate type (9.4.2 [dcl.init.aggr]) for which that type (if it is a union) or each of its anonymous union members (otherwise) either has at least one variant member of non-volatile literal type or has no variant members, or
      • has at least one constexpr constructor or constructor template (possibly inherited (9.9 [namespace.udecl]) from a base class) that is not a copy or move constructor, .
    • if it is a union, at least one of its non-static data members is of non-volatile literal type, and
    • if it is not a union, all of its non-static data members and base classes are of non-volatile literal types.
Date: 2022-09-25.18:08:42

Suggested resolution:

Change in 6.8.1 [basic.types.general] paragraph 10 as follows:

A type is a literal type if it is:
  • ...
  • a possibly cv-qualified class type (Clause 11 [class]) that has all of the following properties:
    • it has a constexpr destructor (9.2.6 [dcl.constexpr]),
    • it is either
      • is a closure type (7.5.5.2 [expr.prim.lambda.closure]),
      • is an aggregate type (9.4.2 [dcl.init.aggr]) for which that type (if it is a union) or each of its anonymous union members (otherwise) either has at least one variant member of non-volatile literal type or has no variant members, or
      • has at least one constexpr constructor or constructor template (possibly inherited (9.9 [namespace.udecl]) from a base class) that is not a copy or move constructor, and
    • if it is a union, at least one of its non-static data members is of non-volatile literal type, and
    • if it is not a union, all of its non-static non-variant data members and base classes are of non-volatile literal types.
Date: 2022-09-25.18:08:42

According to 6.8.1 [basic.types.general] paragraph 10, a type is a literal type only if it satisfies the following:

A type is a literal type if it is:
  • ...
  • a possibly cv-qualified class type (Clause 11 [class]) that has all of the following properties:
    • it has a constexpr destructor (9.2.6 [dcl.constexpr]),
    • it is either a closure type (7.5.5.2 [expr.prim.lambda.closure]), an aggregate type (9.4.2 [dcl.init.aggr]), or has at least one constexpr constructor or constructor template (possibly inherited (9.9 [namespace.udecl]) from a base class) that is not a copy or move constructor,
    • if it is a union, at least one of its non-static data members is of non-volatile literal type, and
    • if it is not a union, all of its non-static data members and base classes are of non-volatile literal types.
[Note 4: A literal type is one for which it might be possible to create an object within a constant expression. ... —end note]

However, the normative rule disagrees with the note. Consider:

  struct A { A(); };
  union U {
    A a;
    constexpr U() {}
    constexpr ~U() {}
  };

It is certainly possible to create an object of type U in a constant expression, even though U is not a literal type.

In the suggested resolution, the aggregate type rule is intended to capture the fact that it is not possible for aggregate initialization of a non-empty union to leave no active member (and similarly for each anonymous union member in a non-union union-like class).

History
Date User Action Args
2022-08-19 07:54:33adminsetmessages: + msg6890
2022-08-19 07:54:33adminsetstatus: open -> tentatively ready
2022-06-21 06:32:55adminsetmessages: + msg6857
2022-06-18 00:00:00admincreate