Espacios de nombres
Variantes
Acciones

Inicialización por constante

De cppreference.com
< cpp‎ | language

Establece los valores iniciales de las variables estáticas con una constante en tiempo de compilación.

Contenido

[editar] Sintaxis

static T & ref = constexpr; (1)
static T objeto = constexpr; (2)

[editar] Explicación

La inicialización por constante se realiza después (hasta C++14)en lugar de (desde C++14) la inicialización cero de los objetos estáticos y locales al hilo y antes que cualquier otra inicialización. Solamente las siguientes variables son inicializadas por constante:

1) una referencia estática o local al hilo, si está vinculada a un glvalue estático, a un objeto temporal (o a su subobjeto), o a una función, y si cada expresión (incluyendo las conversiones implícitas) en el inicializador de la referencia es una expresión constante;
2) un objeto estático o local al hilo de tipo de clase que que se inicializa mediante una llamada al constructor, si el constructor es constexpr y todos los argumentos del constructor (incluyendo las conversiones implícitas) son expresiones constantes, y si los inicializadores en la lista de inicializadores del constructor y los inicializadores con llaves o el signo igual de los miembros de la clase solamente contienen expresiones constantes;
3) un objeto estático o local al hilo (no necesariamente de tipo de clase), que no es inicializado por una llamada al constructor, si el objeto es inicializado con un valor o si cada expresión en su inicializadore es una expresión constante.

Los efectos de la inicialización por constante son los mismos que los efectos de la inicialización correspondiente, excepto que está garantizado que está completa antes que empiece cualquier otra inicialización de un objeto estático o local al hilo, y puede realizarse en tiempo de compilación.

[editar] Notas

Se permite al compilador que inicialice otros objetos estáticos y locales al hilo usando la inicialización por constante si puede garantizar que el valor sería el mismo como si se hubiera seguido el orden de inicialización estándar.

En la práctica, la inicialización por constante se realiza en tiempo de compilación, y representaciones precalculadas de los objetos se almacenan como parte de la imagen del programa (p. ej., en la sección .data). Si una variable es tanto const como inicializada por constante, su representación de objeto puede ser almacenada en una sección de sólo lectura en la imagen del programa (p. ej., en la sección .rodata).

[editar] 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 un inicializador
                         // que la preceda, esta inicialización ocurre después de const
const int S::c = 5;      // inicialización por constante, garantizado que 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

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
CWG 2026 C++14 estaba especificado que la inicialización cero siempre ocurre
primero, inclusive antes que la inicialización por constante
no hay inicialización cero si se aplica
la inicialización por constante

[editar] Véase también