Inicialización por constante
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:
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 |