En C++ existen constantes de tiempo de compilación y de tiempo de enlace.
const es un objeto que no se puede modificar después de la inicialización. Pero const no siempre garantiza que el valor sea conocido en tiempo de compilación; puede ser calculado solo en tiempo de ejecución.constexpr garantiza que la expresión o función se calculará en tiempo de compilación.Ejemplo:
const int x = time(0); // const, pero NO constexpr: el valor se calcula en tiempo de ejecución constexpr int y = 2 + 2; // constexpr: conocido en tiempo de compilación constexpr int square(int x) { return x * x; } int arr[square(3)]; // tamaño del arreglo — expresión de tiempo de compilación
Use constexpr para expresiones constantes que deben estar disponibles para el compilador, por ejemplo, para los tamaños de arreglos o parámetros de plantilla.
¿Puede una función declarada como constexpr ser llamada con argumentos no constantes?
Respuesta: ¡Sí! Si los argumentos son conocidos en tiempo de compilación, el resultado se calculará en ese momento. Si los argumentos solo son conocidos en tiempo de ejecución, la función se calculará como una normal.
constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Se llamará en tiempo de ejecución
Historia
Uno de los módulos estableció el tamaño del arreglo a través de
const int, pensando que era una constante de tiempo de compilación. En otro compilador, esto causó un error, porque el valor se calculó en tiempo de ejecución y el tamaño del arreglo no cumplió con el estándar.
Historia
En el cálculo de hashes, el compilador no pudo optimizar los cálculos porque se utilizaba una variable
const, en lugar deconstexpr. Resultado: disminución del rendimiento en más de 2 veces en las nuevas versiones.
Historia
Al migrar a estándares modernos, se confundieron las palabras clave y declararon la función como
const, en lugar deconstexpr, lo que impidió usar el resultado en expresiones de plantilla en tiempo de compilación. Un diagnóstico rápido mostró el error, pero en la revisión fue a la rama principal.