C ++ - Überladen [] -Operator

8

Ich habe eine Template-Klasse Array:

%Vor%

Ich habe einige Fragen zum Operator [] overloading (Ich habe dieses Beispiel im Netz gefunden).

Ich verstehe, dass T& operator [](int idx) den Verweis auf den Array-Wert mit dem Index idx zurückgibt und dass T operator [](int idx) const seinen Wert zurückgibt. Ich bin mir jedoch nicht sicher, in welchem ​​Fall Referenz oder Wert mit [] operator zurückgegeben wird.

Wenn ich auch T operator [](int idx) const - & gt; T operator [](int idx) , beschwert sich der Compiler. Warum das? Ich kann verstehen, dass der Compiler sich beschwert, weil nur der Rückgabetyp anders ist, aber warum er sich nicht beschwert, wenn const hinzugefügt wird? Das bedeutet nur, dass nicht die Klasseneinbauten modifiziert sind, oder?

Ich habe versucht, diese kleine Hauptimplementierung zu debuggen:

%Vor%

Und jedes Mal, wenn T& operator [](int idx) aufgerufen wird. Warum?

Vielen Dank im Voraus.

    
Mojo28 04.01.2016, 14:22
quelle

2 Antworten

12

Die operator[] Überladung wird basierend auf der const -Qualität des Objekts, das Sie aufrufen, ausgewählt.

%Vor%

Wenn Sie const aus T operator[] entfernen, erhalten Sie einen Fehler, weil die Elementfunktionen nicht die gleiche const -Qualität und -Parameter haben können, da es keine Möglichkeit gibt, zwischen ihnen auszuwählen.

    
TartanLlama 04.01.2016, 14:28
quelle
12

Als erstes beachten Sie [] als syntaktischen Zucker für den Aufruf von this->operator[] .

Die const Version wird aufgerufen, wenn this ein const Zeiger ist, andernfalls wird die nicht const Version aufgerufen.

Wenn Sie fortfahren, sollten Sie const T& operator [](int idx) const { verwenden, d. h. die const version gibt eine const referenz zurück. Das wird den Overhead einer tiefen Kopie sparen.

Schließlich ist die const -ness einer Funktion Teil ihrer Signatur. Dadurch können Sie basierend auf const -ness überladen. Andernfalls könnten Sie nicht die beiden Versionen von operator[] haben.

    
Bathsheba 04.01.2016 14:29
quelle