Dégradation du pointeur et résolution de surcharge de fonctions
En C, la résolution de surcharge vise à sélectionner la fonction la mieux adaptée pour un ensemble d'arguments donné. Lorsque plusieurs fonctions sont des candidats viables, celle avec le coût de conversion minimum est préférée.
Considérez le modèle de fonction suivant qui imprime la longueur d'un tableau de caractères :
template <size_t N> void foo(const char (&s)[N]) { std::cout << "array, size=" << N - 1 << std::endl; }
Lors de l'appel de foo( "hello"), il identifie avec succès la spécialisation du modèle et affiche "array, size=5". Cependant, étendre foo pour prendre en charge des scénarios sans tableau introduit une ambiguïté.
void foo(const char* s) { std::cout << "raw, size=" << strlen(s) << std::endl; }
Maintenant, appeler foo("hello") imprime étonnamment "raw, size=5", même si la spécialisation du modèle semble être un correspondance plus précise.
La raison de l'ambiguïté
L'ambiguïté survient parce qu'un tableau est essentiellement un pointeur vers son premier élément, ce qui rend la conversion tableau-pointeur peu coûteuse. Selon les règles de résolution des surcharges C, une surcharge nécessitant moins d’opérations de conversion est privilégiée. Dans ce cas, la conversion tableau en pointeur est une transformation de valeur L à faible coût qui est supérieure à la déduction d'argument de modèle nécessaire.
Travailler autour de l'ambiguïté
Pour garantir que la surcharge de fonction de tableau est invoquée, une solution de contournement consiste à définir la surcharge non-tableau en tant que modèle de fonction comme eh bien :
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; }
Cela garantit que la spécialisation du modèle est prioritaire car la commande partielle entre en jeu.
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!