Espacios de nombres
Variantes
Acciones

Especificador consteval (desde C++20)

De cppreference.com
< cpp‎ | language
 
 
 
 
  • 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

consteval

[editar] 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) [editar]
Especificador constinit(C++20) Afirma que una variable tiene inicialización estática, es decir inicialización cero e inicialización por constante.[editar]
Expresión constante Define una expresión que puede evaluarse en tiempo de compilación.