Introduction
C 17 a introduit le if constexpr mot-clé, permettant une compilation conditionnelle basée sur des constantes de compilation. Cependant, des erreurs inattendues peuvent survenir lors de l'utilisation de if constexpr dans des fonctions non basées sur un modèle. Cet article explore ces problèmes et propose une solution.
Exemple de code
Considérez le code suivant :
<code class="cpp">#include <iostream> #include <type_traits> int main() { 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; }
Erreur de compilation
Ce code génère une erreur de compilation lorsque l'instruction if constexpr est dans la fonction principale :
main.cpp:8:32: error: invalid type argument of unary ‘*’ (have ‘int’) std::cout << "Ptr to " << *value << std::endl;
Explication
If constexpr uniquement fonctionne dans les fonctions de modèle car il permet au compilateur d'éviter d'instancier des branches qui ne sont pas prises au moment de la compilation. Cette optimisation est essentielle pour une métaprogrammation de modèle efficace.
Dans les fonctions non-modèles, if constexpr évalue toujours les deux branches, même si le type est déduit par decltype. Cela signifie que l'erreur dans le code ci-dessus est provoquée par la tentative de déréférencement d'une valeur int dans la branche if.
Solution
Pour résoudre ce problème, vous pouvez déplacez l'instruction if constexpr dans une fonction de modèle. Par exemple :
<code class="cpp">template <typename T> void print(T value) { 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() { auto value = 100; print(value); }</code>
Ce code modifié compilera et imprimera le résultat attendu :
Ref to 100
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!