Namespaces
Variants

std::is_constant_evaluated

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
Défini dans l'en-tête <type_traits>
constexpr bool is_constant_evaluated() noexcept;
(depuis C++20)

Détecte si l'appel de fonction se produit dans un contexte évalué de manière constante. Retourne true si l'évaluation de l'appel se produit dans l'évaluation d'une expression ou d'une conversion qui est manifestement évaluée de manière constante ; sinon retourne false.

Pour déterminer si les initialisateurs des variables suivantes sont manifestement évalués de manière constante, les compilateurs peuvent d'abord effectuer une évaluation constante d'essai :

  • variables de type référence ou de type intégral ou énumération qualifié const ;
  • variables static et thread local.

Il n'est pas recommandé de dépendre du résultat dans ce cas.

int y = 0;
const int a = std::is_constant_evaluated() ? y : 1;
// Trial constant evaluation fails. The constant evaluation is discarded.
// Variable a is dynamically initialized with 1

const int b = std::is_constant_evaluated() ? 2 : y;
// Constant evaluation with std::is_constant_evaluated() == true succeeds.
// Variable b is statically initialized with 2

Paramètres

(aucun)

Valeur de retour

true si l'évaluation de l'appel se produit durant l'évaluation d'une expression ou conversion manifestement évaluée de manière constante ; sinon false .

Implémentation possible

// Cette implémentation nécessite C++23 pour if consteval.
constexpr bool is_constant_evaluated() noexcept
{
    if consteval
    {
        return true;
    }
    else 
    {
        return false;
    }
}

Notes

Lorsqu'il est directement utilisé comme condition d'une static_assert ou d'une instruction constexpr if , std :: is_constant_evaluated ( ) retourne toujours true .

Parce que if consteval est absent en C++20, std::is_constant_evaluated est généralement implémenté en utilisant une extension du compilateur.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_is_constant_evaluated 201811L (C++20) std::is_constant_evaluated

Exemple

#include <cmath>
#include <iostream>
#include <type_traits>
constexpr double power(double b, int x)
{
    if (std::is_constant_evaluated() && !(b == 0.0 && x < 0))
    {
        // A constant-evaluation context: Use a constexpr-friendly algorithm.
        if (x == 0)
            return 1.0;
        double r {1.0};
        double p {x > 0 ? b : 1.0 / b};
        for (auto u = unsigned(x > 0 ? x : -x); u != 0; u /= 2)
        {
            if (u & 1)
                r *= p;
            p *= p;
        }
        return r;
    }
    else
    {
        // Let the code generator figure it out.
        return std::pow(b, double(x));
    }
}
int main()
{
    // A constant-expression context
    constexpr double kilo = power(10.0, 3);
    int n = 3;
    // Not a constant expression, because n cannot be converted to an rvalue
    // in a constant-expression context
    // Equivalent to std::pow(10.0, double(n))
    double mucho = power(10.0, n);
    std::cout << kilo << " " << mucho << "\n"; // (3)
}

Sortie :

1000 1000

Voir aussi

constexpr spécificateur (C++11) spécifie que la valeur d'une variable ou fonction peut être calculée à la compilation
consteval spécificateur (C++20) spécifie qu'une fonction est une fonction immédiate , c'est-à-dire que tout appel à la fonction doit être dans une évaluation constante
constinit spécificateur (C++20) affirme qu'une variable a une initialisation statique, c'est-à-dire initialisation à zéro et initialisation constante