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

Comment pouvons-nous déterminer si une expression C 11 est un « constexpr » au moment de la compilation ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-03 17:42:13843parcourir

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

Détermination des expressions Constexpr en C 11

Question : Est-il possible de déterminer si une expression C 11 est une expression constante (constexpr) à au moment de la compilation ?

Réponse :Oui, c'est possible en utilisant la technique suivante :

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

#define isprvalconstexpr(e) noexcept(makeprval(e))

Explication :

La macro isprvalconstexpr prend une expression e et renvoie vrai si e est une expression constante prvalue (c'est-à-dire qu'elle peut être évaluée à moment de la compilation). Ceci est déterminé à l'aide de l'opérateur nosauf, qui renvoie false si e contient des appels de fonction potentiellement évalués qui n'ont pas de spécification d'exception de non-lancement, d'expressions de lancement ou de conversions dynamiques ou d'identifiants de type pouvant être lancés.

Limites :

Il est important de noter que cette technique présente une limite. L'opérateur nosauf peut parfois donner des faux négatifs, ce qui signifie qu'il peut signaler qu'une expression n'est pas une expression constante même si elle l'est. Cela se produit lorsque les expressions « potentiellement évaluées » au sein de e ne sont pas réellement évaluées, ce qui peut se produire dans certaines circonstances même si elles sont formellement considérées comme potentiellement évaluées.

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