Maison > Article > développement back-end > Comment puis-je m'assurer qu'aucune clause « else » n'est jamais exécutée dans une chaîne C « constexpr if-else » ?
Empêcher le non-respect des clauses Constexpr If-Else
En C , on peut rencontrer le besoin d'affirmer que toutes les conditions constexpr if dans une instruction if-else est remplie. Sans une telle assertion, la clause else peut être prise de manière inattendue.
Considérez le code suivant :
if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { // I want the else clause never taken. But I heard the code below is not allowed static_assert(false); }
On pourrait supposer que la clause else ne serait jamais prise puisque toutes les conditions doivent être mutuellement exclusif. Cependant, selon le standard C, une telle assertion n'est pas autorisée.
Solution : Dépendance du modèle
Pour éviter que la clause else ne soit prise, il faut faire en sorte que la clause else soit prise en compte. instruction rejetée en fonction des paramètres du modèle. Ceci peut être réalisé en utilisant le code suivant :
template <class... T> constexpr std::false_type always_false{}; if constexpr(condition1){ ... } else if constexpr (condition2) { .... } else if constexpr (condition3) { .... } else { static_assert(always_false<T>); }
Raisonnement
La norme C stipule qu'un programme est mal formé si aucune spécialisation valide ne peut être générée pour un modèle ou une sous-instruction dans un modèle. En rendant l'instruction supprimée dépendante des paramètres du modèle, le compilateur peut garantir qu'aucune spécialisation valide ne peut être générée lorsqu'aucune des conditions n'est remplie, empêchant ainsi la clause else d'être prise.
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!