Maison > développement back-end > C++ > le corps du texte

Comment puis-je m'assurer qu'aucune clause « else » n'est jamais exécutée dans une chaîne C « constexpr if-else » ?

Linda Hamilton
Libérer: 2024-11-27 11:10:09
original
640 Les gens l'ont consulté

How Can I Ensure No `else` Clause is Ever Executed in a C   `constexpr if-else` Chain?

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);
}
Copier après la connexion

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>);
}
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal