Maison  >  Article  >  développement back-end  >  Qu'arrive-t-il aux assertions statiques dans les branches « constexpr if » non prises ?

Qu'arrive-t-il aux assertions statiques dans les branches « constexpr if » non prises ?

DDD
DDDoriginal
2024-11-27 14:50:14718parcourir

What Happens to Static Assertions in Untaken `constexpr if` Branches?

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!

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