Constant initialization
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:
|
(hasta C++11) |
|
(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 |