Wie wirkt sich der const-Modifikator für Elementfunktionen auf die Überladungsauflösung aus?

8

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:

  1. Funktion mit genau passendem Argument wird zuerst ausgewählt
  2. 1-stufige implizite Konvertierung wird als nächstes versucht

In beiden Fällen 1 & amp; 2 sind mehrdeutig. Kann jemand das erklären? Danke.

    
void.pointer 15.01.2015, 21:01
quelle

1 Antwort

7

Bei Klassenmethoden wird der this -Teil als ein zusätzliches Argument betrachtet. Wenn Sie% con_de% also const setzen, wird die Überladung gesetzt:

%Vor%

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:

%Vor%

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.

    
Barry 15.01.2015, 21:09
quelle

Tags und Links