Dégradation du pointeur vs modèles déduits : résoudre le puzzle des priorités
Dans le domaine du C, l'interaction entre les surcharges de fonctions et la déduction de modèles peut conduisent parfois à des résultats inattendus. Un bon exemple se présente lorsqu'une fonction est surchargée pour gérer à la fois les tableaux et les pointeurs bruts. Considérez le code suivant :
template <size_t N> void foo(const char (&s)[N]) { std::cout << "array, size=" << N - 1 << std::endl; } void foo(const char *s) { std::cout << "raw, size=" << strlen(s) << std::endl; }
Initialement conçue pour imprimer la longueur d'un tableau, cette fonction est étendue pour prendre en charge les non-tableaux. Cependant, cette extension conduit à une ambiguïté déroutante :
foo("hello") // now prints raw, size=5
Pourquoi la surcharge "brute" est-elle choisie plutôt que la version "array" prévue, alors que cette dernière correspond plus précisément aux paramètres ? La réponse réside dans un concept subtil connu sous le nom de dégradation du pointeur.
La dégradation du pointeur est une conversion implicite d'un tableau en son pointeur correspondant. Dans ce cas, le tableau "hello" est converti silencieusement en un pointeur const char * vers son premier élément. De ce fait, la surcharge qui gère les pointeurs est prioritaire.
Ce comportement découle du coût des conversions en C . Les surcharges sont évaluées pour minimiser le coût de conversion des arguments en paramètres. Dans ce cas, la conversion tableau en pointeur est moins coûteuse qu'une conversion de paramètre tableau en fonction.
Pour contourner ce problème, on peut également définir la deuxième surcharge comme modèle :
template <typename T> auto foo(T s) -> std::enable_if_t<std::is_convertible<T, char const *>{}> { std::cout << "raw, size=" << std::strlen(s) << std::endl; }
Cette approche garantit que la version modèle est préférée car elle élimine la conversion de la dégradation du pointeur.
En conclusion, la priorité donnée à la dégradation du pointeur par rapport Les modèles déduits sont une conséquence du principe de minimisation des coûts dans la résolution des surcharges. Pour éviter les ambiguïtés, il est crucial de considérer à la fois les conversions implicites et les types de surcharges lors de la surcharge de fonctions.
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!