Maison >développement back-end >C++ >Comment garantir les erreurs de compilation pour les cas non gérés dans les instructions C Constexpr if-else ?
Affirmer la non-occurrence des clauses Constexpr if-else
En C , il est crucial de s'assurer que toutes les instructions constexpr if ont au moins une vraie branche. Lorsqu'aucune des conditions n'est satisfaite, une erreur de compilation est souhaitée pour éviter un comportement inattendu.
Une idée fausse courante est d'utiliser static_assert(false) dans la clause else. Cependant, cette approche n'est pas acceptée par le compilateur.
Pour résoudre ce problème, la solution consiste à rendre l'instruction rejetée dépendante des paramètres du modèle. En introduisant une classe constexpr std::false_type et en la spécialisant avec un paramètre de modèle T, nous pouvons créer une condition qui sera toujours évaluée à false.
Voici un exemple :
template <class... T> constexpr std::false_type always_false{}; if constexpr (condition1) { ... } else if constexpr (condition2) { ... } else if constexpr (condition3) { ... } else { // Always false condition static_assert(always_false<T>); }
Selon au standard C, section [temp.res]/8, si aucune spécialisation valide ne peut être générée pour un modèle ou une sous-instruction d'une instruction constexpr if dans un modèle, le programme est considéré comme mal formé. Cela garantit effectivement que la clause else n'est jamais utilisée et qu'une erreur de compilation est générée.
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!