Maison >développement back-end >C++ >Pourquoi les assertions statiques échouent-elles dans les blocs « constexpr if (false) » de C 17 ?

Pourquoi les assertions statiques échouent-elles dans les blocs « constexpr if (false) » de C 17 ?

DDD
DDDoriginal
2024-11-25 20:33:13367parcourir

Why Do Static Assertions Fail in C  17's `constexpr if (false)` Blocks?

Échec du comportement de Static_Assert dans Constexpr If (False) Blocks

L'introduction de constexpr if dans C 17 a soulevé des inquiétudes quant au comportement de static_asserts au sein de la branche non prise de ces déclarations.

Selon le C standard, lorsqu'une instruction constexpr if apparaît dans une entité basée sur un modèle, les instructions rejetées dans la branche non prise ne sont pas instanciées. Cette règle interdit l'exécution de static_asserts avec de fausses conditions non dépendantes lors de l'instanciation du modèle, jugeant ainsi le programme mal formé.

Ce comportement découle d'une règle plus générale qui s'applique à tous les modèles : si aucune spécialisation valide ne peut être générée pour un modèle avec une sous-instruction dans un constexpr si celui-ci est évalué à faux, le programme est considéré comme mal formé, que le modèle soit ou non instancié.

Par exemple, le code suivant est mal formé, bien qu'il soit compilé sans avertissement en utilisant les versions récentes de Clang :

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>(); 
}

Ce comportement s'étend aux appels indirects à static_asserts. Si une fonction constexpr (modèle) contient un static_assert avec une fausse condition non dépendante, elle ne peut pas être appelée dans la branche non prise d'une instruction constexpr if, même dans un modèle distinct.

Implications et précautions

Cette limitation sur static_asserts dans constexpr if (faux) blocs peut avoir un impact sur la sécurité et l'utilité de constexpr en remplacement de SFINAE. Les développeurs doivent être conscients de toute utilisation potentielle de static_asserts dans des fonctions ou des bibliothèques qui peuvent être invoquées indirectement dans la branche non prise de telles instructions.

Par conséquent, il est conseillé d'éviter d'utiliser static_asserts dans du code qui pourrait être exécuté dans le cadre d'un bloc constexpr if (false). Cette pratique garantit que les programmes restent bien formés et évite les avertissements ou erreurs potentiels du compilateur.

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