Nein, überladene Operatoren sind keine Operatoren - sie sind Funktionen. Also ist der GCC richtig zu akzeptieren das.
myobj++++;
entspricht myobj.operator++(0).operator++(0);
Es ist zulässig, eine Memberfunktion (einschließlich eines überladenen Operators) für ein temporäres Objekt des Klassentyps zuzulassen.
Da bei benutzerdefinierten Typen Operatorenüberladungen buchstäblich nur Funktionsaufrufe sind, befolgen Sie die Semantik von Funktionsaufrufen.
Wenn Sie das eingebaute Verhalten emulieren wollen, gibt es tatsächlich eine sehr einfache Lösung: Machen Sie den Rückgabewert const
:
Vor einigen Jahren gab es eine Debatte darüber, ob benutzerdefinierte Operatoren das eingebaute Verhalten genau modellieren sollten. Ich bin mir nicht sicher, welche Denkrichtung momentan die Oberhand hat, aber die Art der Rückkehr von operator++(int)
const
war ein Weg, dies zu erreichen.
myint ++ gibt etwas zurück, das MyInt (2) ähnlich ist. Es ist ähnlich wie MyInt (2) ++. Eine temporäre Klasse wird in der operator ++ -Funktion erstellt und Sie erhöhen die temporäre Klasse. Nachdem es zurückgegeben wurde, wird es gelöscht, sobald die nächste Anweisung abgeschlossen ist (hier ist es der zweite Operator ++).
Das Problem besteht darin, dass die Anforderungen des postincrement-Operators für integrale Typen und für benutzerdefinierte Typen unterschiedlich sind. Insbesondere ein benutzerdefinierter Postinkrementoperator, der als Elementfunktion implementiert ist, erlaubt die Verwendung von rvalues.
Wenn Sie den Operator als freie Funktion implementiert haben:
%Vor% Dann wären die Anforderungen dieses bestimmten Operators diejenigen, die aus der tatsächlichen Signatur extrahiert werden. Wenn das erste Argument von value übernommen wird, akzeptiert es rvalues direkt, wenn es das Argument von const &
annimmt, dann akzeptiert es rvalues, wenn der Kopierkonstruktor zugänglich ist. Wenn das Argument von nicht konstant &
verwendet wird, dann wird dieser Operator erfordern lvalues.
Tags und Links c++ operator-overloading lvalue