Maison > développement back-end > C++ > Pouvons-nous déterminer si une expression C 11 est « constexpr » au moment de la compilation sans déclarations ?

Pouvons-nous déterminer si une expression C 11 est « constexpr » au moment de la compilation sans déclarations ?

Susan Sarandon
Libérer: 2024-12-02 12:58:11
original
1029 Les gens l'ont consulté

Can We Determine if a C  11 Expression is `constexpr` at Compile Time Without Declarations?

Utilisation de constexpr en C 11 : Détermination des expressions constantes

Question :

Est-ce faisable pour vérifier si une expression C 11 est considérée comme une expression constante (constexpr) pendant la compilation sans en s'appuyant sur des déclarations ?

Réponse :

En utilisant l'opérateur nosauf, il est possible de construire un booléen à la compilation indiquant si une expression constitue un constexpr :

template<typename T>
constexpr typename remove_reference<T>::type makeprval(T&& t) {
  return t;
}

#define isprvalconstexpr(e) noexcept(makeprval(e))
Copier après la connexion

Explication :

Le L'expression nosauf(e) valide les conditions suivantes :

  • L'absence d'appels de fonction avec des spécifications d'exception non lancées ou des appels de variables qui ne constituent pas des expressions constantes.
  • Aucune présence de " throw" expressions.
  • Aucun casting dynamique ou typeid sous la forme de jetables.

Limitations :

En raison de la nature conservatrice des expressions « potentiellement évaluées », il peut y avoir des cas où nosauf peut fournir de faux négatifs. Par exemple :

constexpr int a = (0 ? throw "fooled!" : 42);
constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42)); // returns false
Copier après la connexion

Dans ce cas, a est initialisé avec succès, mais atest est évalué à false car l'expression throw est potentiellement évaluée, même si elle n'est jamais exécutée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal