Funciones constexpr e if constexpr
Evalúe código en tiempo de compilación con constexpr y ramifique con if constexpr.
Funciones constexpr e if constexpr es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Evaluación en tiempo de compilación
La palabra clave constexpr indica al compilador «evalúe esto en tiempo de compilación cuando sea posible». Los cálculos realizados durante la compilación no tienen ningún coste en tiempo de ejecución.
Variables constexpr
Una variable constexpr debe inicializarse con una expresión constante. El resultado queda fijado en tiempo de compilación.
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;Funciones constexpr
Marque las funciones como constexpr para permitir que se ejecuten en tiempo de compilación cuando se las llame con argumentos constantes.
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile timeAlternativa en tiempo de ejecución
Una función constexpr también puede recibir valores conocidos en tiempo de ejecución; en ese caso, se ejecuta durante el tiempo de ejecución.
int n = read_input();
int result = factorial(n); // runtime callRestricciones de las funciones constexpr
Antes de C++14:
- Solo se permitía una instrucción return
- No se permitían bucles
- No se podía modificar el estado local
C++14 flexibilizó estas restricciones; C++17 y C++20 añadieron más posibilidades (try-catch, asignación dinámica y funciones virtuales).
consteval (C++20)
Fuerce la evaluación en tiempo de compilación con consteval. Llamar a una función consteval con argumentos que no sean constantes produce un error.
consteval int square(int x) { return x * x; }
constexpr int c = square(5); // OK
int x = 5;
// int r = square(x); // ERRORconstinit (C++20)
constinit garantiza que la variable se inicialice en tiempo de compilación, pero permite modificarla durante la ejecución.
if constexpr (C++17)
if constexpr es una bifurcación en tiempo de compilación. La rama que no se selecciona ni siquiera se compila, lo que resulta útil para las plantillas.
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}Eliminación de SFINAE
if constexpr sustituye los complejos patrones de SFINAE por una lógica condicional clara. Combinado con traits de tipos, facilita mucho la lectura del código genérico.
Algoritmos en tiempo de compilación
El C++ moderno permite escribir algoritmos sorprendentemente complejos que se ejecutan por completo en tiempo de compilación, como el cálculo de hashes de cadenas, la generación de tablas y los analizadores sintácticos pequeños.
constexpr auto fnv1a(std::string_view s) {
uint32_t h = 2166136261u;
for (char c : s) {
h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
}
return h;
}
constexpr auto x = fnv1a("hello");Plantillas más constexpr
Las funciones constexpr genéricas son una combinación muy potente: permiten escribir código genérico y flexible con respecto a los tipos que se evalúa en tiempo de compilación.
Diagnósticos
Los errores en tiempo de compilación del código constexpr se notifican con ubicaciones detalladas. Los compiladores modernos son bastante buenos para señalar con precisión el paso que causa el problema.
Comprobación rápida
¿Qué hace if constexpr que no haga un if normal?
Resumen
constexpr permite evaluar en tiempo de compilación; consteval lo exige; constinit garantiza la inicialización en tiempo de compilación. if constexpr crea bifurcaciones en tiempo de compilación: la rama no seleccionada nunca se instancia, lo que sustituye a SFINAE en muchos casos.
Preguntas frecuentes
¿La lección «Funciones constexpr e if constexpr» es gratis?
Sí — el texto completo de «Funciones constexpr e if constexpr» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Funciones constexpr e if constexpr»?
Evalúe código en tiempo de compilación con constexpr y ramifique con if constexpr. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Funciones constexpr e if constexpr»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Repaso de plantillas de funciones y clases
- Especialización parcial y completa de plantillas
- Plantillas variádicas y paquetes de parámetros
- Funciones constexpr e if constexpr