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.
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
Palabras clave
Ejemplo
| Esta sección está incompleta Razón: sin ejemplo |
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. |