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
Susan Sarandonoriginal
2024-12-02 12:58:111031parcourir

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))

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

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