if constexpr en C 17 ne fonctionne pas dans les fonctions non basées sur un modèle
Introduction
Le La norme C 17 a introduit la construction if constexpr, qui permet une exécution conditionnelle basée sur des expressions constantes. Cependant, il a été observé que si le comportement de constexpr diffère lorsqu'il est utilisé dans des fonctions basées sur un modèle ou non.
Problème
Considérez la fonction non basée sur un modèle suivante :
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
Ce code entraîne une erreur de compilation car *value n'est pas valide pour le type déduit int.
Réponse
Ce comportement est voulu par la conception. Dans les fonctions basées sur un modèle, if constexpr peut éviter d'instancier des branches qui ne sont pas valides pour des spécialisations de modèles spécifiques. Cependant, dans les fonctions non basées sur un modèle, if constexpr ne supprime pas la compilation de la branche non prise.
Les deux branches de l'instruction if constexpr sont analysées et analysées, même si la branche non prise n'est pas valide. Par conséquent, dans le code ci-dessus, le compilateur tentera d'évaluer *value pour un type int, ce qui entraînera une erreur.
Conclusion
Cette distinction est importante à comprendre lors de l'utilisation de if constexpr. Dans les fonctions non basées sur un modèle, il ne doit être utilisé que pour vérifier des expressions constantes dont la validité est garantie pour toutes les valeurs possibles des paramètres d'entré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!