Garantir des chemins exclusifs Constexpr if-else
Dans les clauses constexpr if-else, il est essentiel de s'assurer que le cas else n'est jamais pris. Traditionnellement, on peut utiliser static_assert(false); de générer une erreur dans de tels cas. Cependant, cette approche génère une erreur de compilation qui affirme de manière inattendue que l'instruction est vraie.
Au lieu de cela, pour garantir que le cas else est inaccessible, l'instruction rejetée doit être rendue dépendante des paramètres du modèle. Ceci peut être réalisé en utilisant le modèle always_false, qui renvoie std::false_type quels que soient les arguments du modèle.
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...>); }
Cette solution est basée sur le fait qu'en C , un programme est considéré comme mal formé si aucun une spécialisation valide peut être générée pour un modèle ou une sous-instruction constexpr if-else. Par conséquent, lorsque la clause else devient inaccessible, le compilateur émettra une erreur de compilation, garantissant que le code reste valide.
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!