Maison > développement back-end > C++ > Pourquoi les assertions statiques dans la fausse branche d'une instruction Constexpr If sont-elles mal formées ?

Pourquoi les assertions statiques dans la fausse branche d'une instruction Constexpr If sont-elles mal formées ?

DDD
Libérer: 2024-11-27 07:17:09
original
955 Les gens l'ont consulté

Why Are Static Assertions in the False Branch of a Constexpr If Statement Ill-Formed?

Static_Asserts dans les blocs Constexpr If en échec : une analyse

En C 17, les instructions constexpr if fournissent un moyen d'exécuter du code de manière conditionnelle au moment de la compilation . Cependant, le comportement de static_asserts au sein de la branche false de telles déclarations a soulevé des inquiétudes.

Le problème vient de la règle qui interdit l'instanciation d'un modèle contenant un static_assert dont la condition est non dépendante et est évaluée à false ( [temp.res]/8). Cette règle garantit la sécurité des types en empêchant un comportement non défini dans les extensions ultérieures du modèle.

Dans le contexte d'une instruction constexpr if, cela signifie que les static_asserts dans la fausse branche sont intrinsèquement mal formés si leur condition est non dépendante. En effet, le compilateur ne peut pas déterminer au moment de la compilation si une spécialisation valide peut être générée pour le modèle contenant le static_assert.

Par exemple, le code suivant est mal formé :

void f() {
  if constexpr (false)
    static_assert(false);   // ill-formed
}
Copier après la connexion

De même, les static_asserts dans les fonctions du modèle constexpr dans la fausse branche sont également mal formées :

template<class T>
void g() {
  if constexpr (false)
    static_assert(false);   // ill-formed
}
Copier après la connexion

Cette règle s'étend aux appels aux fonctions constexpr ou aux fonctions de modèle qui appellent static_asserts. De tels appels dans la fausse branche d'une instruction constexpr if sont interdits, même s'ils ne contiennent pas eux-mêmes d'asserts statiques.

Cette interdiction limite l'utilité des instructions constexpr if, car elle oblige les développeurs à examiner méticuleusement le code pour garantir l'absence de static_asserts dans la fausse branche. Cependant, les static_asserts avec des conditions dépendantes qui peuvent être évaluées comme vraies pour au moins un type sont toujours autorisés dans les instructions constexpr if.

En conclusion, la nature mal formée des static_asserts dans les blocs constexpr if échoués est une conséquence de la règle générale qui interdit aux modèles de contenir des static_asserts avec des conditions non dépendantes qui sont évaluées comme fausses. Il est crucial que les développeurs respectent cette règle pour éviter les comportements indéfinis et maintenir la sécurité des types dans leur code.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal