std::is_constant_evaluated
| 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 |