Détection d'expressions constantes en C 11
En C 11, il est possible de déterminer si une expression est une expression constante (constexpr) pendant compilation, ce qui peut être bénéfique pour optimiser le code et garantir certaines propriétés.
Utilisation nosauf(makeprval(e))
Une façon de déterminer si une expression est une expression constante consiste à utiliser la macro suivante :
#define isprvalconstexpr(e) noexcept(makeprval(e))
où makeprval est une fonction de modèle qui prend une référence à une expression en entrée et renvoie une valeur de la même type.
Explication
L'expression nosauf(e) renvoie false si e contient certaines opérations qui ne sont pas autorisées dans les expressions constantes, telles que les appels de fonction non lancés, expressions de lancement et conversions dynamiques ou typeids jetables. Si l'appel à makeprval n'est pas une expression constante, l'expression nosauf retournera également false.
Limitations
Bien que isprvalconstexpr soit généralement efficace pour détecter les expressions constantes prvalue, il a une limitation subtile. Cela peut donner des faux négatifs dans les cas où une expression est une expression constante mais contient des sous-expressions potentiellement évaluées qui ne sont pas autorisées dans les expressions constantes.
Exemple d'utilisation
L'exemple suivant démontre l'utilisation de isprvalconstexpr :
constexpr int a = (0 ? throw "fooled!" : 42); constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
Dans cet exemple, atest est faux car l'expression (0 ? throw "dupé!" : 42) n'est pas une expression constante, même si l'initialisation de a réussit. C'est parce que la sous-expression non constante « maléfique » lance « dupé ! est potentiellement évalué, même s'il ne l'est jamais réellement dans ce cas précis.
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!