Articulo de referencia

constante

`constexpr` es una palabra clave especificadora en loslenguajes de programación C y C++ que, en términos generales, especifica que algo puede evaluarse en tiempo de compilación ...

`constexpr` es una palabra clave especificadora en loslenguajes de programación C y C++ que, en términos generales, especifica que algo puede evaluarse en tiempo de compilación . [ 1 ] A diferencia del `const` habitual, que especifica acceso de solo lectura,es una forma más fuerte que implica(en la mayoría de los contextos). Si bien en C esto se limita solo a objetos, [ 2 ] puede usarse en objetos, funciones o enlaces estructurados en C++. [ 1 ]constexprconstconstexpr

Las palabras clave adicionales en la familia de palabras clave " " de C++ constincluyen consteval[ 3 ] , que se utiliza para garantizar que una función se ejecute en tiempo de compilación y solo en tiempo de compilación, y constinit, que se utiliza para garantizar la duración del almacenamiento estático/de subprocesos, asegurando la inicialización en tiempo de compilación (pero no la inmutabilidad) [ 4 ] .

Fondo

La palabra constexpres un acrónimo de expresión constante [ 5 ] , introducida por primera vez en C++11 . Antes de la introducción de constexpr, las opciones para especificar constantes y funciones en tiempo de compilación en C++ se limitaban a macros de preprocesador (como #define PI 3.1415926535o macros procedimentales como #define SQUARE(x) ((x) * (x))), que realizaban sustitución textual y, por lo tanto, carecían de la seguridad de tipos de una característica central del lenguaje, o a declarar una constante enumerada (como ), que se limitaba solo a tipos enteros. Una motivación particular para el desarrollo de expresiones en tiempo de compilación fue que , aunque era equivalente a la macro , producía una expresión no constante. [ 6 ]enum{WINDOW_SIZE=600};std::numeric_limits<T>::max()INT_MAX

Las propuestas iniciales para expresiones constantes generalizadas y expresiones en tiempo de compilación fueron presentadas por primera vez para su inclusión en C++ por Gabriel Dos Reis en 2003 [ 7 ] , proponiendo generalizar las expresiones constantes para incluir funciones de valor constante , funciones que podrían evaluarse en tiempo de compilación, con el objetivo particular de mejorar la seguridad de tipos y la portabilidad. [ 6 ] Esta propuesta fue revisada posteriormente con la coautoría de Bjarne Stroustrup y Jens Maurer en 2006 para introducir la constexprpalabra clave, junto con la inclusión de literales definidos por el usuario (objetos de tipos definidos por el usuario con constexprconstructores y destructores) en la definición de expresiones constantes. [ 6 ] , y adoptada en el borrador de C++11 en julio de 2007. [ 8 ] Herb Sutter , presidente del comité de C++, describió en 2026 la adopción de constexprcomo una de las votaciones más "trascendentales" de la historia de C++. [ 9 ]

C++20 introdujo además dos palabras clave de la " constfamilia": constevaly constinit. [ 10 ] [ 11 ] Con la introducción de la reflexión en tiempo de compilación en C++26, se hizo una propuesta para constevalvariables, pero no se agregó. [ 12 ]

constexprPosteriormente se introdujo en C, comenzando en C23 . [ 2 ] [ 13 ]

Semántica

El uso principal de constexpres permitir evaluar cálculos complejos en tiempo de compilación, evitando la sobrecarga en tiempo de ejecución, como marcos de pila o memoria adicionales [ 5 ] sin depender de directivas de preprocesador, así como prevenir ciertos casos de comportamiento indefinido . [ 14 ]

Variables

Una variable o una plantilla de variable puede declararse constexprsi es una definición, es un tipo literal, se inicializa en la declaración y es inicializable mediante una constante. [ 15 ] Dicha constexprvariable se convierte implícitamente en const . También se pueden hacer referencias siempre que se inicialicen mediante una expresión constante y cualquier conversión implícita invocada durante la inicialización también sean expresiones constantes. [ 5 ]constexpr

importar std ;usando std :: array ;// Declarar constantes en tiempo de compilación constexpr double EARTH_GRAVITATIONAL_ACCELERATION = 9.8 ; constexpr double MOON_GRAVITATIONAL_ACCELERATION = EARTH_GRAVITATIONAL_ACCELERATION / 6.0 ; constexpr size_t MAX_LENGTH = 500 ;// Crea una matriz de enteros de longitud 500, utilizando la constante de tiempo de compilación MAX_LENGTH array < int , MAX_LENGTH > numbers ;

C++26 permitió constexprenlaces estructurados [ 16 ] , que pueden enlazarse a tipos agregados (es decir, estructuras ), matrices y pares/tuplas . [ 17 ]

struct Punto { int x ; int y ; };constexpr int NUMS [ 3 ] = { 1 , 2 , 3 };// a = 1, b = 5 constexpr auto [ a , b ] = Point {. x = 1 , . y = 5 }; // id = 3, name = "John Doe", score = 95 constexpr auto [ id , name , score ] = std :: make_tuple ( 3 , "John Doe" , 95 ); // x = 1, y = 2, z = 3 constexpr auto [ x , y , z ] = NUMS ;

Punteros y referencias

En C, los punteros (excepto nullptr), los tipos modificados de forma variable, los tipos atómicos y los tipos volátiles no pueden ser .constexpr

En C++, constexprlos punteros y las referencias están sujetos a restricciones ligeramente diferentes a las de constexprlas variables normales. En el constexprcaso de los punteros, la dirección que contienen debe ser la de una variable con duración de almacenamiento estática y es un puntero constante. Las operaciones aritméticas con punteros sobre estas direcciones (si no se trata de un array ) y las direcciones de las variables de pila no son expresiones constantes.

importar std ;int main () { int x = 3 ; static float val = 3.0f ;// Error (duración de almacenamiento automático) // constexpr int* ptr = &x;// OK (duración de almacenamiento estático) constexpr float * address = & val ; * address = 4.5f ;std :: println ( "{}" , val ); // imprime 4.5 }

Mientras tanto, constexprlas referencias se vinculan únicamente a variables de duración de almacenamiento estática o constexpra variables (independientemente de la duración del almacenamiento). [ 17 ]

importar std ;int main () { static char ch = 'A' ; constexpr char & ref1 = ch ; ref1 = 'c' ; std :: println ( "{}" , ref1 ); // imprime 'c'constexpr int núm = 100 ; constexpr int & ref2 = núm ;std :: println ( "{}" , ref2 - 2 ); // imprime 98 }

Funciones

Una constexprfunción es una función cuyo valor de retorno puede calcularse en tiempo de compilación (es decir, cuando los argumentos son expresiones constantes) y, cuando se llama en tiempo de ejecución, se comporta como una función regular. [ 5 ] Una constexprfunción evaluada en tiempo de compilación detendrá la compilación una vez que se invoque un comportamiento indefinido. [ 14 ]constexpr Las funciones son implícitamente inline . [ 1 ]

constexpr double div ( double a , double b ) noexcept { return a / b ; }constexpr double x = div ( 1 , 0 ); // Impide la compilación, debido a que invoca un comportamiento indefinido

Dado que los tipos de retorno de constexprlas funciones pueden conocerse en tiempo de compilación, pueden invocarse en tiempo de compilación para su uso en expresiones de tiempo de compilación.

constexpr int getFive () noexcept { return 5 ; }int numbers [ getFive () + 7 ]; // Crea un array de 12 enteros

Es posible que las corrutinas no lo sean constexpr. Históricamente, constexprlas funciones tenían muchas más restricciones, incluyendo la prohibición de múltiples returnsentencias, trybloques y bloques de ensamblador en línea , todas las cuales se han relajado gradualmente con cada revisión. [ 1 ] [ 18 ]

C++17 permitió el uso de tipos de cierre y funciones lambda en el contenido de evaluación constante. [ 19 ]

Los métodos de clase y los operadores sobrecargables también pueden declararse con constexpr. Antes de C++14 , constexprlos métodos tenían acceso implícito const, lo que les impedía manipular la clase. [ 5 ] Antes de C++20, las funciones virtuales no podían ser constexpr. [ 1 ] [ 20 ]

Constructores y destructores

Un constexprconstructor es aquel que permite inicializar y declarar la clase en tiempo de compilación. constexprLos constructores están sujetos a los mismos requisitos que constexprlas funciones. [ 19 ] Hasta C++26 , las clases con virtualclases base no podían tener constexprconstructores. La introducción de constexprla herencia virtual busca eventualmente permitir el constexprformato de flujo a través de un constexprconstructor para std::ios_base. [ 21 ] Se garantiza que el constructor generado implícitamente será constexprsi la clase es un tipo literal. [ 22 ] [ 23 ]

Un constexprdestructor (introducido en C++20 ), por su parte, es un destructor que permite la destrucción del objeto en tiempo de compilación. Al igual que los constructores, constexprlos destructores están sujetos a los mismos requisitos que constexprlas funciones. [ 19 ] Las principales motivaciones para la introducción de constexprlos destructores fueron permitir el uso de clases no triviales en tiempo de compilación, como std::stringy std::vector, esta última de las cuales se usa ampliamente en la API de la reflexiónstd::meta en tiempo de compilación de . [ 24 ] Esto ahora permite asignaciones y destrucciones no triviales en contextos de tiempo de compilación. [ 25 ] Se garantiza que el destructor generado implícitamente sea si la clase es un tipo literal. [ 26 ] Al igual que los constructores, los destructores históricamente no permitían la destrucción de clases con clases base. En C++26, varias clases de la biblioteca estándar , que históricamente solo se podían destruir en tiempo de ejecución, se han vuelto elegibles para el tiempo de compilación a través de destructores. [ 27 ]constexprconstexprconstexprvirtualconstexpr

Una clase con miembros estáticos que son instancias de sí misma puede ser constexpr, pero los campos dentro de la clase deben declararse primero, constmientras que las constexprdeclaraciones deben residir fuera de la clase. Intentar declarar una constexprinstancia de una clase como miembro estático de sí misma falla, ya que ninguna definición de un objeto puede ser un tipo incompleto, lo que significa que la clase está incompleta hasta que se cierra. [ 28 ]

struct Color { uint8_t r ; uint8_t g ; uint8_t b ;constexpr Color ( uint8_t r , uint8_t g , uint8_t b ) noexcept : r { r }, g { g }, b { b } {}constexpr ~ Color () = predeterminado ;constante estática Color NEGRO ; constante estática Color ROJO ; constante estática Color VERDE ; constante estática Color AMARILLO ; constante estática Color AZUL ; constante estática Color MAGENTA ; constante estática Color CIAN ; constante estática Color BLANCO ; };inline constexpr Color Color :: BLACK = Color ( 0 , 0 , 0 ); inline constexpr Color Color :: RED = Color ( 255 , 0 , 0 ); inline constexpr Color Color :: GREEN = Color ( 0 , 255 , 0 ); inline constexpr Color Color :: YELLOW = Color ( 255 , 255 , 0 ); inline constexpr Color Color :: BLUE = Color ( 0 , 0 , 255 ); inline constexpr Color Color :: MAGENTA = Color ( 255 , 0 , 255 ); inline constexpr Color Color :: CYAN = Color ( 0 , 255 , 255 ); inline constexpr Color Color :: WHITE = Color ( 255 , 255 , 255 );

Sentencias if en tiempo de compilación

C++ presenta dos formas de sentencias if en tiempo de compilación : if constexpry if consteval. [ 29 ]

El primero, if constexprintroducido en C++17 , permite la ramificación condicional en tiempo de compilación. Requiere que la condición sea una expresión constante convertible a bool. [ 29 ]if constexpr descarta la rama que no se toma, impidiendo su compilación. Esto permite la compilación condicional sin el uso del preprocesador. Sin embargo, la rama descartada, incluso si no se compila, es requerida por el compilador para ser sintácticamente válida o aceptada. [ 30 ]return las instrucciones en una instrucción descartada no participan en la deducción del tipo de retorno de la función .

importar std ;using std :: conditional_t ; using std :: is_pointer_v ; using std :: remove_pointer_t ;plantilla < typename T > constexpr auto getValue ( T t ) noexcept -> conditional_t ​​< is_pointer_v < T > , remove_pointer_t < T > , T > { if constexpr ( is_pointer_v < T > ) { return * t ; } else { return t ; } }int main () { int * numbers = new int [ 5 ]{ 1 , 2 , 3 , 4 , 5 }; int firstNumber = getValue ( numbers ); int five = getValue ( 5 );eliminar números ; }

Este último, if constevalintroducido en C++23 , actúa como un if constexprdonde la condición es si la ifcondición se evalúa en tiempo de compilación o en tiempo de ejecución. [ 31 ]

template < typename T > constexpr T * arrayOfLength ( size_t n ) { if consteval { // El array no puede salir del ámbito de una expresión en tiempo de compilación return nullptr ; } else { // En tiempo de ejecución, permite devolver un puntero a un array asignado en el montón return new T [ n ]; } }

if constevalintroduce una sintaxis adicional: es equivalente a . [ 29 ]if!consteval{/* stmt1 */}else{/* stmt2 */}ifconsteval{/* stmt2 */}else{/* stmt1 */}

Evolución

El constexprespecificador ha evolucionado con cada revisión del estándar C++, ya sea eliminando restricciones constexpro introduciendo nuevos contextos para el uso de la palabra clave, dado que la versión histórica constexpren C++11 estaba sujeta a muchas más restricciones que en el C++ contemporáneo.

C++11

En el borrador de C++11 de 2008 , constexprse permitió que las funciones se llamaran a sí mismas recursivamente . [ 32 ] Posteriormente, en 2010, las funciones constexpr permitieron pasar sus parámetros como referencia constante [ 33 ] y en 2011, se permitieron static_assertcomprobaciones y usingsentencias dentro del contexto de constexprlas funciones. [ 34 ] En el estándar final de C++11, constexprlas funciones solo permitieron una sentencia return . [ 1 ]

C++14

C++14 eliminó la restricción de que todos constexprlos métodos fueran implícitamente const, permitiendo constexprque los métodos pudieran cambiar los valores de las variables miembro. [ 5 ]

C++14 permitía múltiples sentencias de retorno , bloques de control de flujo como if/ elsey switch, bucles y declaraciones de variablesconstexpr dentro de funciones. [ 35 ] C++14 también permitía que las funciones constexpr tuvieran voidun tipo de retorno. El siguiente ejemplo muestra un verificador de números primos que funciona en tiempo de compilación.

constexpr bool isPrime ( uint64_t number ) noexcept { if ( number < 2 ) { return false ; } else if ( number == 2 || number == 3 ) { return true ; } else if ( number % 2 == 0 || number % 3 == 0 ) return false ; } for ( uint64_t i = 5 ; i * i <= number ; i += 6 ) { if ( number % i == 0 || number % ( i + 2 ) == 0 ) { return false ; } } return true ; }static_assert ( isPrime ( 264223787557 ));

C++17

C++17 especificó que un constexprespecificador en la declaración de una función o una variable miembro estática la hace implícitamente inline . [ 1 ] C++17 introdujo , influyendo en la metaprogramación de plantillas . [ 29 ]if constexpr

Desde C++17, los tipos de cierre y las funciones lambda se pueden usar en expresiones constantes. [ 19 ] Todas las lambdas son implícitamente constexpr. [ 19 ]

constexpr int FACTOR = 10 ;constexpr auto scaleBy = [ FACTOR ]( int x ) -> int { return x * FACTOR ; };static_assert ( scaleBy ( 4 ) == 40 );

C++20

C++20 flexibilizó las restricciones para constexprla evaluación en diversos contextos [ 19 ] [ 20 ] [ 25 ] , incluyendo llamadas a funciones virtuales, asignación transitoria de montón, constexprdestructores [ 1 ] [ 25 ] y otros. Se debe saber que las asignaciones de montón en constexprcontextos se liberan dentro de constexprlos mismos. [ 25 ]

C++20 eliminó la restricción sobre constexprlos métodos virtuales . [ 1 ] [ 20 ]

clase Base { public : virtual constexpr size_t f () const { return sizeof ( int ); }constexpr virtual ~ Base () = default ; };clase MyIntArray : pública Base { privado : int * a ; const size_t length ; público : constexpr size_t f () const override { return length ; }constexpr MyIntArray ( size_t n ) : a { new int [ n ]}, length { n } {}constexpr ~ MyIntArray () override { delete [] a ; }constexpr int & operator []( size_t i ) { return a [ i ]; }constexpr const int & operator []( size_t i ) const { return a [ i ]; }MyIntArray ( const MyIntArray & ) = delete ; MyIntArray & operator = ( const MyIntArray & ) = delete ; };

C++23

C++23 permitió que las funciones contuvieran gotosentencias, trybloques, variables estáticas y ensamblador en línea. [ 1 ] C++23 introdujo además if consteval. [ 29 ]

C++26

C++26 permite el uso de herencia virtual en constructores y destructores declarados con constexpr. [ 21 ]constexpr Se agregó soporte para enlaces estructurados [ 17 ] , constexprconversión de void*[ 36 ] , constexprcolocación de nuevos [ 37 ] , así como constexprlanzamiento de excepciones. [ 38 ]constexpr Se introdujo soporte adicional para tipos de biblioteca estándar. [ 27 ]

Hana Dusíková publicó en 2025 una propuesta para constexprcorrutinas para su adopción en C++26, pero se retrasó hasta C++29. [ 39 ]

consteval

`consteval` es un especificador de función que indica que la función es una "función inmediata" [ 10 ] , es decir, que cada llamada a la función debe producir una expresión constante en tiempo de compilación. En otras palabras, la función solo puede ejecutarse en tiempo de compilación . [ 3 ] Si el compilador no puede evaluar la llamada en tiempo de compilación, el programa no se compila. [ 40 ]consteval También se utiliza paraif constevalbloques. [ 29 ]

importar std ;usando std :: array ;consteval int cuadrado ( int x ) { return x * x ; }plantilla < tamaño_t N > consteval array < int , N > cuadradosHasta () { array < int , N > cuadrados ; para ( tamaño_t i = 0 ; i < N ; ++ i ) { cuadrados [ i ] = cuadrado ( i ); } return cuadrados ; }int main () { constexpr int a = square ( 5 ); // OK: evaluado en tiempo de compilación// OK: evaluado en tiempo de compilación porque square() es consteval int b = square ( 5 ); constexpr array < int , 5 > table = squaresUpTo < 5 > (); int x = 3 ; // NO OK: x no es una expresión constante // int y = square(x); }

constinit

`constint` es un especificador de variable que garantiza la inicialización estática , conduración estática / global o de almacenamiento de subprocesos (Produce un error de compilación si se usa en una variable local o si no se inicializa en tiempo de compilación. [ 4 ] no implica inmutabilidad y, por lo tanto, puede considerarse una variable mutable en tiempo de compilación. [ 40 ] no puede usarse junto con, pero cuando la variable declarada es una referencia , es equivalente a.no exige destrucción constante nicalificación -, permitiendo objetos conconstructores pero sindestructor.thread_localconstinitconstinitconstinitconstexprconstexprconstinitconstconstexprconstexpr

const char * g () { return "Inicialización dinámica" ; }constexpr const char * f ( bool b ) { return b ? "Inicializador de constante" : g (); }// OK: inicializado en tiempo de compilación constint const char * s1 = f ( true );// NO ESTÁ BIEN: g() no es una expresión constante // constaint const char* s2 = f(false);

constinitSe utiliza para evitar el llamado "fiasco del orden de inicialización estática", donde los objetos globales (o estáticos) en diferentes unidades de traducción se inicializan en un orden no especificado. [ 11 ]

En otros idiomas

Los equivalentes de constexpren otros lenguajes incluyen consten C# [ 41 ] y Rust [ 42 ] que declaran un símbolo para que sea en tiempo de compilación. Rust además tiene const fn, equivalente a una constexprfunción en C++. [ 43 ]const en Go permite constantes en tiempo de compilación, pero no funciones. [ 44 ] Zig presenta una comptimepalabra clave para forzar que el código se ejecute en tiempo de compilación. [ 45 ]

Una biblioteca de Javanet.onedaybeard.constexpr , , presenta una anotación@ConstExpr que simula constexprdesde C++ en Java. [ 46 ] Mientras tanto, una variable que se declara con static finaly de tipo primitivo o java.lang.Stringse considera una expresión constante. [ 47 ]

Véase también

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 cppreference.com. "especificador constexpr (desde C++11)" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  2. 1 2 cppreference.com. "especificador constexpr (desde C23)" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  3. 1 2 "especificador consteval (desde C++20)" . cppreference.com . cppreference.com . Consultado el 3 de mayo de 2026 .
  4. 1 2 "especificador constante (desde C++20)" . cppreference.com . cppreference.com . Consultado el 3 de mayo de 2026 .
  5. 1 2 3 4 5 6 Microsoft Learn (22 de febrero de 2023). "constexpr (C++)" . learn.microsoft.com . Microsoft Learn.
  6. ^ Gabriel Dos Reis, Bjarne Stroustrup, Jens Maurer (3 de noviembre de 2006 ) . "Expresiones constantes generalizadas - Revisión 5" (PDF) . open-std.org .{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace )
  7. Gabriel Dos Reis (21 de septiembre de 2003). "Expresiones constantes generalizadas" (PDF) . open-std.org . WG21.
  8. Herb Sutter (21 de junio de 2025). "Informe de viaje: Reunión de estándares ISO C++ de junio de 2025 (Sofía, Bulgaria)" . herbsutter.com . Herb Sutter.
  9. Sutter, Herb (21 de junio de 2025). "Informe de viaje: Reunión de estándares ISO C++ de junio de 2025 (Sofía, Bulgaria)" . herbsutter.com . herbsutter.com . Recuperado el 10 de abril de 2026. Hasta hoy, quizás la encuesta sobre una sola característica más trascendental en la historia de C++ fue la encuesta en Toronto en julio de 2007 para adoptar el primer documento "constexpr" de Bjarne Stroustrup y Gabriel Dos Reis en el borrador de C++11. Mirando hacia atrás ahora, podemos ver el cambio tectónico que comenzó para C++.
  10. 1 2 Richard Smith, Andrew Sutton, Daveed Vandevoorde (4 de octubre de 2018). "Funciones inmediatas" . open-std.org . WG21.{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace )
  11. 1 2 Eric Fiselier (18 de julio de 2019). "Añadiendo la palabra clave constinit" . open-std.org . WG21.
  12. Barry Rezvin, Peter Dimov (13 de marzo de 2025). "Valores y variables Consteval solamente" . open-std.org . WG21.
  13. Alex Gilding, Jens Gustedt (6 de julio de 2022). "El especificador constexpr para definiciones de objetos" . open-std.org . WG14.
  14. 1 2 WG21. "7 - Expresiones, 7.7 - Expresiones constantes" . eel.is. WG21 . Consultado el 14 de abril de 2026 .{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  15. cppreference.com. "Expresiones constantes - Entidades inicializadas constantes" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  16. cppreference.com. "Declaración de enlace estructurado (desde C++17)" . cppreference.com . cppreference.com . Consultado el 11 de mayo de 2026 .
  17. 1 2 3 Jabot, Corentin; Bi, Brian (12 de noviembre de 2024). "Enlaces estructurados de constexpr y referencias a variables de constexpr" (PDF) . open-std.org . open-std.org . Recuperado el 10 de mayo de 2026 .
  18. Richard Smith (15 de marzo de 2013). "Relajando las restricciones en las funciones constexpr" . WG21.
  19. 1 2 3 4 5 6 "especificador constexpr (desde C++11)" . cppreference.com . cppreference.com. 2026. Consultado el 25 de abril de 2026 .
  20. 1 2 3 Peter Dimov, Vassil Vassilev (4 de mayo de 2018). "Permitir llamadas a funciones virtuales en expresiones constantes" . open-std.org . WG21.
  21. ^ Hana Dusíková (17 de febrero de 2025) . «herencia virtual constexpr» . open-std.org . GT21.
  22. cppreference.com. "Constructores predeterminados" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  23. cppreference.com (14 de abril de 2026). "Expresiones constantes - Tipo literal" . cppreference.com . cppreference.com.
  24. Wyatt Childers; et al. (26 de junio de 2024). "P2996R4 - Reflexión para C++26" . isocpp.org . WG21. 
  25. 1 2 3 4 Peter Dimov (19 de julio de 2019). "Más contenedores constexpr" . open-std.org . WG21.
  26. cppreference.com. "Destructores" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  27. ^ Hana Dusíková (11 de febrero de 2025) . «contenedores y adaptadores constexpr» . open-std.org . GT21.
  28. WG21 (23 de abril de 2026). "Borrador del estándar C++ - Declaraciones y definiciones" . eel.is. WG21. En la definición de un objeto, el tipo de ese objeto no debe ser un tipo incompleto ([basic.types.general]), un tipo de clase abstracta ([class.abstract]) o una matriz (posiblemente multidimensional) de los mismos.{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )
  29. 1 2 3 4 5 6 cppreference.com. "sentencia if" . cppreference.com . cppreference.com . Consultado el 14 de abril de 2026 .
  30. Jens Maurer (20 de junio de 2016). "P0292R2: constexpr if: Una sintaxis ligeramente diferente" . open-std.org . WG21.
  31. Barry Revzin, Richard Smith, Andrew Sutton, Daveed Vandevoorde (22 de marzo de 2021). "if consteval" . open-std.org . WG21.{{cite web}}: CS1 maint: varios nombres: lista de autores ( enlace )
  32. Lawrence Crowl (5 de febrero de 2009). "Problemas con Constexpr" . open-std.org . WG21 . Consultado el 15 de abril de 2026 .
  33. Stroustrup, Bjarne (14 de febrero de 2010). "Funciones Constexpr con parámetros de referencia constantes (un resumen)" (PDF) . open-std.org . WG21 . Consultado el 15 de abril de 2026 .
  34. Merill, Jason (25 de marzo de 2011). "static_assert e inicialización de listas en funciones constexpr" . open-std.org . WG21 . Consultado el 15 de abril de 2026 .
  35. Richard Smith (15 de marzo de 2013). "Relajando las restricciones en las funciones constexpr" . open-std.org . WG21.
  36. Corentin Jabot, David Ledger (13 de febrero de 2023). "constexpr cast from void*: towards constexpr type-erasure" (PDF) . open-std.org . WG21.
  37. ^ Barry Rezvin (19 de marzo de 2024). "ubicación constexpr nueva" . open-std.org . GT21.
  38. Hana Dusíková (19 de noviembre de 2024). "Permitir el lanzamiento de excepciones en la evaluación constante" . open-std.org . GT21.
  39. Hana Dusíková (17 de febrero de 2025). "corrutinas constexpr" . open-std.org . GT21.
  40. 1 2 "const vs constexpr vs consteval vs constinit en C++20" . cppstories.com . 28 de noviembre de 2022. Consultado el 3 de mayo de 2026 .
  41. Microsoft Learn (26 de enero de 2026). "La palabra clave const" . learn.microsoft.com . Microsoft Learn.
  42. Rust Language Foundation (25 de marzo de 2026). "Keyword const" . doc.rust-lang.org . Rust Language Foundation.
  43. Rust Language Foundation (30 de abril de 2026). "The Rust Reference - Constant evaluation" . doc-rust.lang.org . Rust Language Foundation.
  44. Rob Pike (25 de agosto de 2014). "Constantes" . go.dev . El blog de Go.
  45. zig.guide (4 de enero de 2026). "Comptime" . zig.guide . Zig Software Foundation.
  46. Adrian Papari. "junkdog/constexpr-java" . github.com . junkdog . Consultado el 14 de abril de 2026 .
  47. Oracle Corporation. "Capítulo 15. Expresiones - 15.28. Expresiones constantes" . docs.oracle.com . Especificación del lenguaje Java . Consultado el 14 de abril de 2026 .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Constexpr&oldid=1356337537 "