constinit
specifier
(since C++20)
-
-
constinit- afirma que una variable tiene inicialización estática, es decir, zero initialization y constant initialization , de lo contrario el programa está mal formado.
-
Contenidos |
Explicación
El especificador constinit declara una variable con duración de almacenamiento estática o de hilo.
|
El especificador constinit también puede aplicarse a declaraciones de enlace estructurado . En este caso, constinit también se aplica a la variable de nombre único introducida por la declaración. |
(desde C++26) |
Si una variable se declara con constinit , su declaración inicializadora debe aplicarse con constinit . Si una variable declarada con constinit tiene inicialización dinámica (incluso si se realiza como inicialización estática ), el programa está mal formado.
Si no hay una declaración constinit accesible en el punto de la declaración inicializadora, el programa está mal formado, no se requiere diagnóstico.
constinit no puede utilizarse junto con constexpr . Cuando la variable declarada es una referencia, constinit es equivalente a constexpr . Cuando la variable declarada es un objeto, constexpr exige que el objeto debe tener inicialización estática y destrucción constante y hace que el objeto esté calificado como const, sin embargo, constinit no exige destrucción constante ni calificación const. Como resultado, un objeto de un tipo que tiene constructores constexpr y ningún destructor constexpr (por ejemplo std:: shared_ptr < T > ) podría declararse con constinit pero no con constexpr .
const char* g() { return "dynamic initialization"; } constexpr const char* f(bool p) { return p ? "constant initializer" : g(); } constinit const char* c = f(true); // CORRECTO // constinit const char* d = f(false); // error
constinit también puede utilizarse en una declaración no inicializadora para indicar al compilador que una variable thread_local ya está inicializada, reduciendo la sobrecarga que de otro modo sería incurrida por una variable de protección oculta.
extern thread_local constinit int x; int f() { return x; } // no se necesita verificación de una variable de guardia
Notas
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_constinit
|
201907L
|
(C++20) | constinit |
Palabras clave
Ejemplo
#include <cassert> constexpr int square(int i) { return i * i; } int twice(int i) { return i + i; } constinit int sq = square(2); // OK: la inicialización se realiza en tiempo de compilación // constinit int x_x = twice(2); // Error: se requiere un inicializador en tiempo de compilación int square_4_gen() { static constinit int pow = square(4); // constinit int prev = pow; // Error: constinit solo puede aplicarse a una // variable con duración de almacenamiento estático o de hilo int prev = pow; pow = pow * pow; return prev; } int main() { assert(sq == 4); sq = twice(1); // A diferencia de constexpr, este valor puede modificarse posteriormente en tiempo de ejecución assert(sq == 2); assert(square_4_gen() == 16); assert(square_4_gen() == 256); assert(square_4_gen() == 65536); }
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 2543 | C++20 |
el comportamiento no estaba claro si la variable declarada con
constinit
se inicializa dinámicamente como parte de la inicialización estática |
el programa está mal formado
en este caso |
Véase también
consteval
especificador
(C++20)
|
especifica que una función es una función inmediata , es decir, cada llamada a la función debe estar en una evaluación constante |
constexpr
especificador
(C++11)
|
especifica que el valor de una variable o función puede calcularse en tiempo de compilación |
| expresión constante | define una expresión que puede evaluarse en tiempo de compilación |
| inicialización constante | establece los valores iniciales de las variables estáticas a una constante en tiempo de compilación |
| inicialización a cero | establece el valor inicial de un objeto a cero |