Maison >développement back-end >C++ >Pourquoi « if constexpr » ne fonctionne-t-il pas dans les fonctions non basées sur un modèle en C 17 ?
if constexpr ne se comporte pas comme prévu dans les fonctions non basées sur un modèle en C 17
En C 17, l'instruction if constexpr autorise l'utilisation conditionnelle compilation basée sur des expressions constantes au moment de la compilation. Cependant, lorsque vous tentez d'utiliser cette fonctionnalité dans une fonction non basée sur un modèle, des erreurs de compilation inattendues peuvent se produire.
Considérez l'extrait de 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; }</code>
Lors de la compilation de ce code, une erreur sera se produit sur la ligne tentant de déréférencer « valeur » dans l'instruction if constexpr. En effet, si constexpr n'est pas pris en charge dans les fonctions non basées sur des modèles.
Pourquoi uniquement les modèles ?
Ce comportement est inhérent à la conception. si constexpr est destiné à empêcher l'instanciation de code de modèle non valide basé sur des spécialisations spécifiques. Dans l'exemple fourni, la fonction non basée sur un modèle vérifie si « valeur » est un pointeur à l'aide de std::is_pointer_v
Solution
À utiliser if constexpr en non- Dans des contextes basés sur un modèle, envisagez d'encapsuler le code dans une fonction de modèle ou d'utiliser une macro qui se comportera différemment au moment de la compilation. Par exemple :
<code class="cpp">#include <iostream> #include <type_traits> template<typename T> void print(T value) { if constexpr (std::is_pointer_v<T>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { auto n = 1000; print(n); int *ptr = &n; print(ptr); }</code>
Dans ce cas, la fonction d'impression est basée sur un modèle, donc si le comportement constexpr est correctement appliqué en fonction du paramètre de modèle.
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!