Última actualización:2026-10-12
La familia completa de const en C++¶
Esquema
- const
- constexpr
- C++20
- consteval
- constinit
Nota: todos los ejemplos de código de este artículo se han publicado en el planeta de conocimiento.
1. const¶
const es una de las primeras palabras clave que encontramos al aprender C++/C; suele utilizarse como cv-qualifier para indicar que el objeto es inmutable. No garantiza la evaluación en tiempo de compilación: el momento concreto de la evaluación lo decide el compilador. Por ejemplo:
const double count_1 = 3.3;
std::array<double, static_cast<int>(count_1)> moreDoubles1 {1.1, 2.2, 3.3};
Pero escrito así funciona con normalidad:
La clave está en la evaluación de expresiones en tiempo de compilación, y por eso C++11 introdujo constexpr.2. constexpr¶
constexpr permite especificar que el valor de una variable puede aparecer en una expresión constante; basta con cambiar el const del ejemplo anterior por constexpr para que funcione con normalidad.
constexpr double count_2 = 3.3;
std::array<double, static_cast<int>(count_2)> moreDoubles2 {1.1, 2.2, 3.3};
constexpr no tiene por qué ejecutarse únicamente en tiempo de compilación. Su significado esencial es que puede calcularse en tiempo de compilación, pero si se usa una variable o función constexpr en tiempo de ejecución, también puede ejecutarse en tiempo de ejecución.
Por ejemplo: result1 y result2 son completamente distintos; result1 se calcula en tiempo de compilación, pero result2 se calcula en tiempo de ejecución. Una pregunta al aire: ¿sabes por qué?
Así pues, no porque una función esté marcada con constexpr se calculará necesariamente en tiempo de compilación.
constexpr int compileTimeSum(int a, int b) {
return a + b;
}
int main() {
constexpr int result1 = compileTimeSum(3, 5);
int x = 10;
int result2 = compileTimeSum(x, 20);
return 0;
}
3. C++20¶
3.1 consteval¶
consteval resuelve el problema anterior: solo puede aplicarse a funciones y fuerza que todas las llamadas se realicen en tiempo de compilación. Si ahora cambiamos el constexpr del ejemplo anterior por consteval, ¿qué le ocurre a result2?
Pues se produce un error: call to consteval function 'compileTimeSum(x, 20)' is not a constant expression
consteval int compileTimeSum(int a, int b) {
return a + b;
}
int main() {
constexpr int result1 = compileTimeSum(3, 5);
int x = 10;
int result2 = compileTimeSum(x, 20);
return 0;
}
3.2 constinit¶
constinit permite forzar la inicialización constante de variables estáticas o locales a un hilo.
- No puede usarse junto con constexpr ni consteval
- No es un especificador de tipo; su función es assert
- Garantiza que la variable se inicialice estáticamente
- Solo puede aplicarse a static o thread_local
Por ejemplo: lo siguiente da un error de compilación: error: 'constinit' can only be applied to a variable with static or thread storage duration
constinit int a = 100;
int main() {
++a;
constinit auto b = 100; // error
// b has thread storage duration
constinit thread_local auto b = 100;
}
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事
- C++ restrict y optimización del compilador | C++那些事