Espacios de nombres
Variantes
Acciones

std::is_constant_evaluated

De cppreference.com
< cpp‎ | types
 
 
Biblioteca de servicios
 
Apoyo de tipos
Tipos básicos
Tipos fundamentales
Tipos enteros de anchura fija (C++11)
Límites numéricos
Interfaz de C de límites numéricos
Información de tipo
en tiempo de ejecución
Rasgos de tipos
Categorías de tipos
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Propiedades de tipos
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(hasta C++20)
(C++11)(en desuso en C++20)
(C++11)
Constantes de rasgos de tipos
Metafunciones
(C++17)
Contexto de evaluación constante
is_constant_evaluated
(C++20)
Operaciones soportadas
Relaciones y consultas de propiedades
Modificaciones de tipos
(C++11)(C++11)(C++11)
Transformaciones de tipos
(C++11)
(C++11)
(C++17)
(C++11)(hasta C++20)(C++17)
 
Definido en el archivo de encabezado <type_traits>
constexpr bool is_constant_evaluated() noexcept;
(desde C++20)

Detecta si una llamada a función ocurre en un contexto evaluado constante. Devuelve true si la evaluación de la llamada ocurre dentro de la evaluación de una expresión o conversión que es manifestadamente evaluada constante; de lo contrario devuelve false.

Las siguientes expresiones (incluyendo conversiones al tipo destino) son manifestadamente evaluadas constante:

  • Donde se requiera gramaticalmente una expresión constante, incluyendo:
  • inicializadores de variables estáticas (static) y locales al hilo (thread_local), cuando todas las subexpresiones de los inicializadores (incluyendo llamadas al constructor y conversiones implícitas) son expresiones constantes (es decir, cuando los inicializadores son inicializadores constantes).

Para probar las últimas dos condiciones, los compiladores pueden primero realizar una evaluación constante de prueba de los inicializadores. En este caso no se recomienda depender del resultado.

int y;
const int a = std::is_constant_evaluated() ? y : 1;
// Falla la evaluación constante de prueba. Se descarta la evaluación constante.
// La variable a se inicializa dinámicamente con 1
 
const int b = std::is_constant_evaluated() ? 2 : y;
// La evaluación constante con std::is_constant_evaluation() == true tiene éxito.
// La variable b se inicializa estáticamente con 2

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

true si la evaluación de la llamada ocurre dentro de una expresión de conversión que es manifestadamente evaluada constante; de lo contrario, false.

[editar] Notas

Cuando se usa directamente como la condición de la declaración static_assert o de la instrucción constexpr if, std::is_constant_evaluated() siempre devuelve true.

[editar] Example

#include <type_traits>
#include <cmath>
#include <iostream>
 
constexpr double power(double b, int x)
{
    if (std::is_constant_evaluated() && !(b == 0.0 && x < 0)) {
        // Un contexto de evaluación constante: Usar un algoritmo amigable con constexpr.
        if (x == 0)
            return 1.0;
        double r = 1.0, p = x > 0 ? b : 1.0 / b;
        auto u = unsigned(x > 0 ? x : -x);
        while (u != 0) {
            if (u & 1) r *= p;
            u /= 2;
            p *= p;
        }
        return r;
    } else {
        // Dejemos que el generador de código se las averigue.
        return std::pow(b, double(x));
    }
}
 
int main()
{
    // Un contexto de expresión constante
    constexpr double kilo = power(10.0, 3);
    int n = 3;
    // No es una expresión constante porque n no puede convertirse a un rvalue
    // en un contexto de expresión constante
    // Equivalente a std::pow(10.0, double(n))
    double mucho = power(10.0, n);
 
    std::cout << kilo << " " << mucho << "\n"; // (3)
}

Salida:

1000 1000