Warum wählt der Iostream-Operator die scheinbar falsche Überladung?

8

Betrachten Sie diesen Code:

%Vor%

Die Ausgabe ist (kompiliert mit dem VS2015 C ++ Compiler):

%Vor%

Es scheint also so, als ob der Compiler die erwartete const wchar_t* Überladung für f auswählt (da es eine implizite Konvertierung von X nach const wchar_t* gibt).

Es scheint jedoch so zu sein, dass wcout << x die const void* -Überladung anstelle von const wchar_t* eins auswählt (beim Drucken einer Adresse anstelle einer wchar_t -Zeichenfolge).

Warum ist das?

PS Ich weiß, dass die richtige Art, X zu drucken, darin besteht, eine Überladung von operator<< like wostream& operator<<(wostream& , const X&) zu implementieren, aber das ist nicht der Punkt von die Frage.

    
Mr.C64 28.07.2017, 16:43
quelle

1 Antwort

4

Bei der Ableitung von Vorlagenargumenten werden die Konvertierungsfunktionen nicht berücksichtigt:

%Vor%

Die zweite Deklaration berücksichtigt nicht die Konvertierung operator const wchar_t* () const .

Ich kann das Standardangebot nicht finden, cppreference Vorlage Argumentableitung, Implizite Conversions sagt:

  

Die Typableitung berücksichtigt keine impliziten Konvertierungen (abgesehen von den oben aufgeführten Typanpassungen): das ist der Job für die Überladungsauflösung, was später passiert.

    
Maxim Egorushkin 28.07.2017, 17:08
quelle