Especificador consteval
(desde C++20)
consteval
- Especifica que una función es una función inmediata. Es decir, toda llamada a la función debe producir una constante en tiempo de compilación.
Contenido |
[editar] Explicación
El especificador consteval
declara que una función o plantilla de función sea una función inmediata. Es decir, toda llamada a la función debe (directamente o indirectamente) producir una expresión constante en tiempo de compilación.
Una función inmediata es una función constexpr
, y debe satisfacer los requisitos aplicables a las funciones constexpr
o a los constructores constexpr
, según el caso. Al igual que constexpr
, un especificador consteval
implica inline
. Sin embargo, no puede aplicarse a destructores, o a funciones de asignación o desasignación de memoria.
A lo sumo, uno de los especificadores constexpr
, consteval
, y constinit
puede aparecer dentro de la misma secuencia de especificadores de declaración. Si cualquier declaración de una función o plantilla de función contiene un especificador consteval
, entonces todas las declaraciones de esa función o plantilla de función deben contener el especificador.
Una invocación potencialmente evaluada de una función inmediata cuyo ambito de no-bloque más interno no es un ámbito de parámetro de función de una función inmediata o la rama verdadera al evaluar una instrucción consteval if (desde C++23) debe producir una expresión constante; a tal invocación se le conoce como una invocación inmediata.
consteval int sqr(int n) { return n*n; } constexpr int r = sqr(100); // de acuerdo int x = 100; int r2 = sqr(x); // ERROR: Llamada no produce una constante consteval int sqrsqr(int n) { return sqr(sqr(n)); // No es una expresión constante en este punto, pero de acuerdo } constexpr int dblsqr(int n) { return 2*sqr(n); // ERROR: Función envolvente no es consteval // y sqr(n) no es una constante }
Una expresión de identificador que denota una función inmediata puede aparecer solamente dentro de una subexpresión de una invocación inmediata o dentro de un contexto de función inmediata (es decir, un contexto mencionado anteriormente, en el que una llamada a una función inmediata no necesita ser una expresión constante). Un puntero o referencia a una función inmediata puede tomarse pero no puede evitar la evaluación de expresión constante:
consteval int f() { return 42; } consteval auto g() { return &f; } consteval int h(int (*p)() = g()) { return p(); } constexpr int r = h(); // de acuerdo constexpr auto e = g(); // mal formada: un puntero a una función inmediata // no es un resultado permisible de una expresión constante
[editar] Palabras clave
[editar] Ejemplo
Esta sección está incompleta Razón: sin ejemplo |
[editar] Véase también
Especificador constexpr | Especifica que el valor de una variable o función se puede calcular en tiempo de compilación (C++11) |
Especificador constinit (C++20)
|
Afirma que una variable tiene inicialización estática, es decir inicialización cero e inicialización por constante. |
Expresión constante | Define una expresión que puede evaluarse en tiempo de compilación. |