Maison >développement back-end >C++ >Pourquoi une surcharge de fonction « const char* » prévaut-elle sur une fonction de modèle « const char (&)[N] » ?

Pourquoi une surcharge de fonction « const char* » prévaut-elle sur une fonction de modèle « const char (&)[N] » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-26 18:04:08731parcourir

Why Does a `const char*` Function Overload Prevail Over a `const char (&)[N]` Template Function?

Conflits de surcharge : décroissance du pointeur vs déduction de modèle

Question :

Pourquoi une fonction avec un paramètre de type const char* a priorité sur un modèle de fonction avec un paramètre de type const char (&s)[N] lorsque les deux sont également applicable ?

Cause fondamentale :

L'ambiguïté vient du coût relatif des conversions. La résolution des surcharges favorise les fonctions qui nécessitent moins d'opérations de conversion. Un tableau est en fait un pointeur vers son premier élément, ce qui implique que la conversion tableau en pointeur coûte moins cher que la déclaration d'un modèle de fonction basé sur un tableau.

Explication standard :

Selon le standard C ([over.match.best]/(1.3), (1.6)) :

  • Les fonctions non spécialisées sont préférées aux modèles de fonctions spécialisées.
  • Si deux conversions ont le même rang, elles ne peuvent pas être distinguées.

Dans ce cas :

  • La conversion d'un tableau en pointeur est une transformation Lvalue avec correspondance exacte rang.
  • À l'exclusion des transformations Lvalue, le rang de conversion n'est pas significatif.
  • Par conséquent, aucune des deux séquences de conversion n'est meilleure, conduisant à une ambiguïté et à la sélection de la surcharge char const*.

Solution de contournement possible :

Pour donner la priorité à la fonction basée sur un modèle, définissez la deuxième surcharge également comme modèle de fonction :

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;
}

Cet ordre partiel garantit que la fonction basée sur un modèle est sélectionnée le cas échéant.

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!

Déclaration:
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