Ich habe den folgenden Testcode:
%Vor% Dieser Code kann nicht kompiliert werden, da der Aufruf von Comparison()
mehrdeutig ist. Ich erwarte dieses Verhalten.
Wenn ich jedoch eine der Comparison()
Überladungen const
mache, wie in: void Comparison(std::string const&) const
oder void Comparison(CString const&) const
(aber nicht beides), kompiliert der Code und wählt die nicht-konstante Überladung aus.
Überladungsauflösungsregeln sind ziemlich komplex und ich habe nichts gesehen, was beschreibt, wie const
diese Situation beeinflusst. Mein Verständnis ist:
In beiden Fällen 1 & amp; 2 sind mehrdeutig. Kann jemand das erklären? Danke.
Bei Klassenmethoden wird der this
-Teil als ein zusätzliches Argument betrachtet. Wenn Sie% con_de% also const setzen, wird die Überladung gesetzt:
Für CString
müssen wir zwei Conversions durchführen: eine (1)
Conversion und eine Conversion in const
. Aber für CString
müssen wir nur eine einzige Umwandlung durchführen: in (2)
. Daher wird std::string
bevorzugt.
Wir können dies überprüfen, indem wir eine dritte Funktion hinzufügen, die eine einzige Konvertierung für (2)
durchführt:
Hier haben wir wieder nur eine einzige Umwandlung (im "ersten" Argument) und daher ist die Überladungsmenge mehrdeutig.
In [over.match.funcs]:
Es wird angenommen, dass eine Elementfunktion einen zusätzlichen Parameter hat, den impliziten Objektparameter, der repräsentiert das Objekt, für das die Elementfunktion aufgerufen wurde. Für die Zwecke der Überladungsauflösung haben statische und nicht statische Elementfunktionen einen impliziten Objektparameter, Konstruktoren jedoch nicht.
Für nicht statische Elementfunktionen ist der Typ des impliziten Objektparameters
- "lvalue reference to cv X" für Funktionen, die ohne Ref-Qualifier oder mit & amp; Ref-Qualifier
- "rvalue reference to cv X" für Funktionen, die mit & amp; & amp; Ref-Qualifier
Dabei ist X die Klasse, deren Funktion ein Member ist und cv die cv-Qualifikation für das Member ist Funktionsdeklaration [Beispiel: Für eine Konst-Member-Funktion der Klasse X wird der Extra-Parameter angenommen habe type "reference to const X". -End-Beispiel]
Bei der Überladungsauflösung ist das implizierte Objektargument nicht von anderen Argumenten zu unterscheiden.
Das erklärt, warum wir this
vs const TestBed&
betrachten. Und dann ist es nur eine Frage des Vergleichs der Konvertierungssequenzen zwischen den Überladungen TestBed&
und (1)
. Für das zweite Argument sind beide Konvertierungssequenzen gleich, aber für das erste Argument hat (2)
eine bessere Konvertierungssequenz (nämlich Exact) - weshalb es ohne Mehrdeutigkeit gewinnt.
Tags und Links c++ c++11 overloading