C ++ identische Methodensignatur, aber unterschiedlicher Rückgabetyp

8

Ich habe den folgenden Code gesehen:

%Vor%

Warum beschwert sich der Compiler nicht über

%Vor%

und wie kann man wissen, welche aufgerufen wird?

    
agentsmith 21.10.2015, 16:00
quelle

3 Antworten

13

Die beiden Funktionen sind eigentlich nicht die gleichen. Nur die zweite Funktion wird als eine const -Memberfunktion deklariert. Wenn das Objekt, von dem das Mitglied aufgerufen wird, const ist, wird die letztere Option verwendet. Wenn das Objekt nicht const ist, wird die erste Option verwendet.

Beispiel:

%Vor%

Wenn beide Funktionen nicht als const deklariert wurden oder beide als const deklariert wurden, würde der Compiler (sollte sich sowieso beschweren)

    
owacoder 21.10.2015, 16:01
quelle
7
  

Warum beschwert sich der Compiler nicht über

Weil const für eine andere Funktionssignatur zählt. Ihre Annahme, dass die Funktionssignaturen identisch sind ist falsch.
Die als const markierte Funktion wird für jede const Instanz oder Referenz von Type<T> aufgerufen.

  

und wie kann man wissen, welcher aufgerufen wird?

Fügen Sie eine cout -Anweisung in die Funktionen ein und testen Sie die folgenden Fälle:

%Vor% %Vor%

Ihr Zuweisungsoperator wird die nicht const-Version aufrufen.

Die const-Version sollte besser wie

aussehen %Vor%

, weil Sie sich nicht immer auf RVO verlassen können (Rückgabewert-Optimierung) und zusätzliche Kopien (insbesondere für ältere Compiler-Implementierungen) erstellt werden können.

Beachten Sie auch, dass der Zuweisungsoperator einen Verweis auf die aktuelle Instanz zurückgeben soll:

%Vor%     
πάντα ῥεῖ 21.10.2015 16:06
quelle
5

Ein paar Worte zu Funktionen Auflösung Priorität. Der Compiler unterscheidet auf folgende Weise zwischen const / non const Funktionen:

Wenn eine Klasse nur const-Funktion mit dem angegebenen Namen und der Argumentliste hat, wird sie für konstante und nicht-konstante Objekte aufgerufen. Nach dem Aufruf dieser Funktion wird das Objekt 'constness' annehmen (auch wenn es nicht const war), dh die Funktion kann nur andere const-Funktionen aufrufen.

Wenn eine Klasse nur eine nicht-konstante Funktion hat, wird sie für nicht-konstante Objekte aufgerufen. Der Versuch, diese Funktion für konstante Objekte aufzurufen, führt zu einem Kompilierungsfehler.

Wenn eine Klasse beide Funktionen zur Verfügung hat, wird die const-Version für konstante Objekte verwendet, die nicht-konstante Version wird für nicht-konstante Objekte verwendet.

Danke an @owacoder dafür, dass ich in der Beschreibung auf das anfängliche Verwechseln aufmerksam gemacht habe.

    
SergeyA 21.10.2015 16:11
quelle