Ich habe den folgenden Code gesehen:
%Vor%Warum beschwert sich der Compiler nicht über
%Vor%und wie kann man wissen, welche aufgerufen wird?
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)
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:
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%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.
Tags und Links c++ templates method-overloading