Namespaces
Variants

Constant initialization

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Establece los valores iniciales de las static variables a una constante en tiempo de compilación.

Contenidos

Explicación

Inicialización constante se realiza en los siguientes casos:

  • Inicializar un objeto de POD type con static storage duration con una constant expression.
(hasta C++11)
  • Inicializar una referencia con static o thread storage duration, donde se cumplen todas las siguientes condiciones:
  • un lvalue que designa un objeto con static storage duration
  • un objeto temporal
  • un subobject de un objeto temporal
  • una función
  • Inicializar un objeto con static o thread storage duration, y se cumple una de las siguientes condiciones:
  • Si el objeto se inicializa mediante una llamada a constructor, donde la full-expression de inicialización es una constant expression, excepto que también puede invocar constexpr constructors para el objeto y sus subobjects (incluso si esos objetos son de tipos de clase no- literal ).
  • En caso contrario, o bien el objeto es value-initialized o cada full-expression que aparece en su inicializador es una constant expression.
(desde C++11)
(hasta C++17)
(desde C++17)
(hasta C++20)
(desde C++20)

Los efectos de la inicialización constante son los mismos que los efectos de la inicialización correspondiente, excepto que se garantiza que se completa antes de que comience cualquier otra inicialización de un objeto estático o thread-local (since C++11) .

Notas

El compilador tiene permitido inicializar otros objetos estáticos y thread-local (since C++11) usando inicialización constante, si puede garantizar que el valor sería el mismo como si se siguiera el orden estándar de inicialización.

La inicialización constante generalmente ocurre cuando el programa se carga en la memoria, como parte de la inicialización del entorno de ejecución del programa.

Ejemplo

#include <iostream>
#include <array>
struct S
{
    static const int c;
};
const int d = 10 * S::c; // no es una expresión constante: S::c no tiene inicializador
                         // previo, esta inicialización ocurre después de const
const int S::c = 5;      // inicialización constante, garantizada de ocurrir primero
int main()
{
    std::cout << "d = " << d << '\n';
    std::array<int, S::c> a1; // OK: S::c es una expresión constante
//  std::array<int, d> a2;    // error: d no es una expresión constante
}

Salida:

d = 50

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 441 C++98 las referencias no podían ser inicializadas constantemente se hizo posible la inicialización constante
CWG 1489 C++11 no estaba claro si la inicialización por valor
de un objeto puede ser una inicialización constante
puede serlo
CWG 1747 C++11 vincular una referencia a una función no podía ser inicialización constante puede serlo
CWG 1834 C++11 vincular una referencia a un xvalue no podía ser inicialización constante puede serlo

Véase también