Warum führt die Überladungsauflösung für den Aufruf max(x, y)
im unten angegebenen Ausdruck return max(max(x, y), z);
zu einem Aufruf der Nicht-Template-Funktion char const* max(char const*, char const*)
?
Soweit ich das verstehe, ist die Funktion max<const char*>(x, y)
besser geeignet als die erste, da x
eine const char* const&
und y
eine const char* const&
!
Warum führt die Überladungsauflösung für den Aufruf
max(x, y)
im unten angegebenen Ausdruckreturn max(max(x, y), z);
zu einem Aufruf der Nicht-Template-Funktionchar const* max(char const*, char const*)
?
Beim Aufruf dieser Funktion:
%Vor% T
wird zu const char*
abgeleitet. Daher wird diese Signatur instanziiert:
Die Funktion ruft intern die binäre Version von max()
mit Argumenten vom Typ const char*
auf. Sowohl die Template- als auch die Nicht-Template-Überladung sind für ein Argument vom Typ const char*
geeignet.
Wenn jedoch zwei Funktionen zum Auflösen des Aufrufs geeignet sind und einer von ihnen keine Vorlage ist, wird die Nicht-Template-Version als beste Lösung betrachtet . p>
Gemäß Paragraph 13.3.3 / 1 des C ++ 11 Standards:
Angesichts dieser Definitionen ** ist eine lebensfähige Funktion F1 als eine bessere Funktion definiert als eine andere lebensfähige Funktion F2 wenn ** für alle Argumente i, ICSi (F1) keine schlechtere Konvertierungssequenz als ICSi (F2) und dann
ist- für ein Argument j ist ICSj (F1) eine bessere Konvertierungssequenz als ICSj (F2) oder, falls nicht,
- Der Kontext ist eine Initialisierung durch benutzerdefinierte Konvertierung (siehe 8.5, 13.3.1.5 und 13.3.1.6) und die Standardkonvertierungssequenz vom Rückgabetyp von F1 zum Zieltyp (d. h. der Typ des Entität wird initialisiert) ist eine bessere Konvertierungssequenz als die Standardkonvertierungssequenz von der Rückgabetyp von F2 zum Zieltyp. [...] oder wenn nicht,
- F1 ist eine Nicht-Template-Funktion und F2 ist eine Funktion Template-Spezialisierung oder, wenn nicht das,
- F1 und F2 sind Spezialisierungen für Funktionsvorlagen und die Funktionsvorlage für F1 ist spezieller als die Vorlage für F2 gemäß den in 14.5.6.2 beschriebenen Teilordnungsregeln.
Dies erklärt, warum die Nicht-Template-Überladung ausgewählt wurde.
Argument Matching - Überladene Funktionen sind für die ausgewählt beste Übereinstimmung von Funktionsdeklarationen im aktuellen Bereich.
Wenn die Schablonenargumentableitung erfolgreich ist, dann die generierte Funktion wird mit den anderen Funktionen verglichen, um die beste Übereinstimmung zu bestimmen, Befolgen Sie die Regeln für die Überladungsauflösung
Eine genaue Übereinstimmung wurde gefunden.
Eine triviale Konvertierung wurde durchgeführt.
Es wurde eine integrale Werbung durchgeführt.
Eine Standardkonvertierung zum gewünschten Argumenttyp existiert.
Eine benutzerdefinierte Konvertierung (entweder Konvertierungsoperator oder Konstruktor) in den gewünschten Argumenttyp existiert.
Es wurden Argumente gefunden, die durch eine Ellipse dargestellt werden.
Tags und Links c++ templates overloading