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