Maison > développement back-end > C++ > Pourquoi la dégradation du pointeur a-t-elle priorité sur les modèles déduits dans la résolution de surcharge C ?

Pourquoi la dégradation du pointeur a-t-elle priorité sur les modèles déduits dans la résolution de surcharge C ?

Mary-Kate Olsen
Libérer: 2024-11-29 19:15:15
original
775 Les gens l'ont consulté

Why Does Pointer Decay Take Precedence Over Deduced Templates in C   Overload Resolution?

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 (&amp;s)[N]) {
    std::cout << "array, size=" << N - 1 << std::endl;
}

void foo(const char *s) {
    std::cout << "raw, size=" << strlen(s) << std::endl;
}
Copier après la connexion

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
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal