Created on2017-11-01.00:00:00 last changed60 months ago
Proposed resolution, June, 2019:
Change 6.10.3.2 [basic.start.static] paragraph 2 as follows:
Constant initializationis performed if a variable ortemporary object with static or thread storage duration isconstant-initializedby a constant initializer(7.7 [expr.const])for the entity. If constantinitialization is not performed, a variable with staticstorage duration (6.8.6.2 [basic.stc.static]) or threadstorage duration (6.8.6.3 [basic.stc.thread]) iszero-initialized (9.5 [dcl.init]). Together,zero-initialization and constant initialization...
Change 7.7 [expr.const] paragraph 2 as follows:
A
constant initializer for avariable ortemporary objecto isan initializer for whichinterpreting its full-expression asaconstant-expression results in a constantexpressionconstant-initialized if
either it has an initializer or itsdefault-initialization results in some initialization beingperformed, and
its initialization full-expression is a constantexpression when interpreted asaconstant-expression, except thatifo is an object,
such an initializerthe initialization full-expression may alsoinvoke constexpr constructors foro and itssubobjects even if those objects are of non-literal classtypes. [Note: Such a class may have a non-trivialdestructor. Within thisevaluation,std::is_constant_evaluated()(21.3.12 [meta.const.eval])returnstrue. —end note]
Change 7.7 [expr.const] paragraph 3 as follows:
A variable isusable in constant expressions afterits initializing declaration is encountered if it is aconstexpr variable, or it isa constant-initializedvariable of reference type or of const-qualifiedintegral or enumeration type, and its initializer is aconstant initializer.
Change 9.2.6 [dcl.constexpr] paragraph 5 as follows:
For a constexpr function or constexpr constructor that isneither defaulted nor a template, if no argument valuesexist such that an invocation of the function or constructorcould be an evaluated subexpression of a core constantexpression (7.7 [expr.const]), or, for aconstructor,a constant initializer foran evaluated subexpression of the initializationfull-expression ofsomeconstant-initialized object(6.10.3.2 [basic.start.static]), the program is ill-formed,no diagnostic required. [Example:...
Notes from the October, 2018 teleconference:
CWG agreed that the example should be well-formed.
[Accepted as a DR at the July, 2019 meeting.]
According to 6.10.3.2 [basic.start.static] paragraph 2,
Constant initializationis performed if a variable or temporary object withstatic or thread storage duration is initialized by a constant initializerfor the entity. If constant initialization is not performed, a variablewith static storage duration (6.8.6.2 [basic.stc.static]) or thread storageduration (6.8.6.3 [basic.stc.thread]) is zero-initialized(9.5 [dcl.init]). Together, zero-initialization and constantinitialization are called static initialization; all other initializationisdynamic initialization.
This appears to require an explicit initializer for constantinitialization and would preclude examples like:
struct S { int i = 1; }; static constexpr S s;where there is no initializer.

| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2020-12-15 00:00:00 | admin | set | messages: +msg6369 |
| 2020-12-15 00:00:00 | admin | set | messages: +msg6368 |
| 2017-11-01 00:00:00 | admin | create | |