Assertions statiques dans Constexpr en échec si des blocs
Introduction
constexpr si introduit en C 17 permet un code plus concis et efficace. Cependant, cela soulève également des questions concernant la gestion des instructions static_assert dans ces blocs if.
Échec des assertions statiques dans les branches non prises
Le texte standard indique que static_assert les instructions sont mal formées dans les branches non prises des instructions constexpr if. Ceci s'applique indépendamment du fait que la condition soit dépendante ou non.
Règle sous-jacente
Cette interdiction est basée sur une règle bien établie pour les modèles, qui stipule qu'un programme est un NDR mal formé (aucun diagnostic requis) si aucune spécialisation valide ne peut être générée pour un modèle. Les assertions statiques avec des conditions non dépendantes qui sont évaluées comme fausses entrent dans cette catégorie.
Impact sur la sécurité et l'utilité
Cette limitation impose une contrainte significative sur la sécurité et l'utilité de constexpr si . Les développeurs doivent être conscients de tout static_asserts potentiel qui peut être appelé dans la branche non prise de l'instruction if.
Exemple
Le code suivant se compile sans avertissement mais est considéré comme mal formé :
template< typename T> constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); }
Portée du Règle
L'interdiction contre les static_asserts s'étend aux graphes d'appel, donc toute fonction appelée dans la branche non prise pouvant contenir des static_asserts est également interdite.
Conclusion
L'échec de static_asserts dans les branches non prises des instructions constexpr if souligne la nécessité d'un examen attentif lors de leur utilisation dans les modèles. Les développeurs doivent s'assurer que les static_asserts avec des conditions non dépendantes qui sont évaluées comme fausses ne sont pas tentées dans la branche non prise de l'instruction if.
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!