Maison >développement back-end >C++ >C 11 peut-il déterminer si une expression est une constante de compilation ?

C 11 peut-il déterminer si une expression est une constante de compilation ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-05 06:04:11997parcourir

Can C  11 Determine if an Expression is a Compile-Time Constant?

Constexpr est-il possible en C 11 ?

Question :

C 11 peut-il déterminer si une expression est une expression constante au moment de la compilation (constexpr) ?

Réponse :

Oui, il est possible de produire une valeur booléenne à la compilation basée sur cette détermination 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))

Cette macro vérifie si l'expression e est une expression constante prvalue en utilisant l'opérateur nosauf. Si noexcept(makeprval(e)) est évalué à true, l'expression e est une expression constante prvalue.

Explication :

Les expressions constantes prvalue ont certaines restrictions :

  • Les appels de fonction doivent avoir des spécifications d'exception sans lancement.
  • Les expressions de lancement sont interdit.
  • Les conversions dynamiques et les expressions typeid doivent être sous une forme non-jetable.

La fonction makeprval n'est pas déclarée comme nosauf, donc si e est une expression constante prvalue, la appeler makeprval(e) sera une expression constante. Ainsi, l'opérateur nosauf retournera vrai.

Limitations :

La macro isprvalconstexpr a certaines limitations :

  • Elle peut produire des faux négatifs dans les cas où l'expression est une expression constante mais où les sous-expressions sont potentiellement évaluées mais pas réellement évaluées.
  • C'est seulement vérifie les expressions constantes prvalue, pas les expressions constexpr générales.

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