Maison  >  Article  >  développement back-end  >  Pourquoi le streaming d'un objet avec conversion implicite en chaîne provoque-t-il un échec de résolution de surcharge ?

Pourquoi le streaming d'un objet avec conversion implicite en chaîne provoque-t-il un échec de résolution de surcharge ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-05 00:57:01278parcourir

Why Does Streaming an Object with Implicit Conversion to String Cause Overload Resolution Failure?

Échec de résolution de surcharge lors de la diffusion d'un objet via une conversion implicite en chaîne

Description du problème

Implicit la conversion en chaîne est généralement déconseillée, et la surcharge de l'opérateur de sortie (<<) pour les types définis par l'utilisateur est plutôt une approche recommandée. Cependant, le code impliquant une conversion implicite et un streaming d'objets peut entraîner une ambiguïté de résolution de surcharge.

Considérez l'exemple suivant :

<code class="cpp">struct NameType {
  operator std::string() { return "wobble"; }
};

struct Person {
  NameType name;
};

int main() {
  std::cout << "bobble";
  std::cout << "wibble";

  Person p;
  std::cout << p.name;
}</code>

Message d'erreur

La compilation de ce code avec GCC 4.3.4 produit l'erreur suivante :

prog.cpp: In function ‘int main()’:
prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

Cause première

L'ensemble de surcharge n'inclut pas la surcharge souhaitée en raison d'une combinaison de facteurs :

  • Instanciation de modèle : La surcharge souhaitée est une instanciation d'une fonction de modèle avec plusieurs paramètres de modèle.
  • Interdiction de conversion implicite : La conversion implicite en chaîne (NameType::operator std::string) empêche la prise en compte de la surcharge souhaitée.

Restriction ADL

Dépendante de l'argument lookup (ADL) n’est pas directement impliqué dans ce problème. ADL est une fonctionnalité de compilation qui s'applique lorsque le compilateur résout un appel de fonction. Dans ce cas, la conversion implicite en chaîne est effectuée par le compilateur sans aucun appel de fonction impliqué.

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