Saltar a contenido

Ú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 int a = 1; // 编译时
const auto x = getdata(); // 运行时
A veces const puede usarse en expresiones constantes de tiempo de compilación, pero hay algunas excepciones, por ejemplo:

const double count_1 = 3.3;
std::array<double, static_cast<int>(count_1)> moreDoubles1 {1.1, 2.2, 3.3};
En este caso se produce un error: the value of 'count_1' is not usable in a constant expression

Pero escrito así funciona con normalidad:

const int count = 3;
std::array<double, count> doubles {1.1, 2.2, 3.3};
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;
}
¿Y quién puede garantizarlo entonces? Por eso llegó C++20.

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;
}
Si se usa consteval sobre una variable, también se produce un error: error: a variable cannot be declared 'consteval'.

https://en.cppreference.com/w/cpp/language/consteval

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

Comentarios