"if constexpr" de C 17 limité aux fonctions de modèle
En C 17, l'introduction de "if constexpr" a suscité un intérêt pour son capacité à exécuter du code de manière conditionnelle en fonction des constantes de compilation. Cependant, un problème survient lorsque vous tentez de l'utiliser dans des fonctions non basées sur un modèle.
Considérez le code suivant :
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { // Compile-time check if value is a pointer if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { // Error when printing a non-pointer print(100); }</code>
Bien que ce code se compile sans erreur dans les fonctions basées sur un modèle, il échoue avec un erreur de compilation lorsqu'il est placé dans une fonction non basée sur un modèle comme print. La raison réside dans le comportement de "if constexpr."
"if constexpr" est conçu pour permettre la compilation conditionnelle du code du modèle. Dans une fonction modèle, le compilateur déduit le type du paramètre au moment de la compilation, permettant ainsi la sélection du chemin de code approprié en fonction du type. Dans ce cas, lorsque la fonction d'impression est modélisée, elle peut identifier si la valeur est un pointeur au moment de la compilation et exécuter la branche de code correspondante.
Cependant, dans une fonction non basée sur un modèle, le type de valeur est connu uniquement au moment de l'exécution, ce qui rend "if constexpr" inefficace. Le compilateur traite les deux branches du conditionnel comme du code exécutable, ce qui entraîne une erreur de compilation lors de la tentative de déréférencement de la valeur dans la branche Ptr lorsque la valeur est un entier.
Pour éviter ce problème, il est nécessaire de placer " if constexpr" dans une fonction modèle ou fournir des informations de type explicites à la fonction non-modèle pour garantir la déduction de type au moment de la compilation.
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!