Movatterモバイル変換


[0]ホーム

URL:


Issue 2366 - WG21 CWG Issues
Title
Can default initialization be constant initialization?
Status
cd5
Section
6.10.3.2 [basic.start.static]
Submitter
Geoffrey Romer

Created on2017-11-01.00:00:00 last changed60 months ago

Messages

msg6369 (view)
Date: 2020-12-15.00:00:00

Proposed resolution, June, 2019:

  1. Change 6.10.3.2 [basic.start.static] paragraph 2 as follows:

  2. 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...
  3. Change 7.7 [expr.const] paragraph 2 as follows:

  4. Aconstant initializer for a variable 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]

  5. Change 7.7 [expr.const] paragraph 3 as follows:

  6. 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.
  7. Change 9.2.6 [dcl.constexpr] paragraph 5 as follows:

  8. 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:...
msg6368 (view)
Date: 2018-10-15.00:00:00

Notes from the October, 2018 teleconference:

CWG agreed that the example should be well-formed.

msg6367 (view)
Date: 2019-07-15.00:00:00

[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
DateUserActionArgs
2020-12-15 00:00:00adminsetmessages: +msg6369
2020-12-15 00:00:00adminsetmessages: +msg6368
2017-11-01 00:00:00admincreate

[8]ページ先頭

©2009-2025 Movatter.jp