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.
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.
Tags und Links c++ iostream operator-overloading