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

Pourquoi la dégradation du pointeur affecte-t-elle la résolution de surcharge dans les modèles de fonctions C ?

DDD
Libérer: 2024-11-24 13:10:13
original
692 Les gens l'ont consulté

Why Does Pointer Decay Affect Overload Resolution in C   Function Templates?

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

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal