Warum myClassObj ++++ keinen Kompilierfehler verursacht: '++' benötigt L-Wert, genau wie Build-Typ?

8

Warum übersetzt myint ++++ mit VS2008-Compiler und gcc 3.42-Compiler? Ich erwartete Compiler sagen lvalwert, Beispiel siehe unten.

%Vor%     
Gob00st 14.07.2011, 10:51
quelle

6 Antworten

8

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.

    
Armen Tsirunyan 14.07.2011, 10:53
quelle
3

Da bei benutzerdefinierten Typen Operatorenüberladungen buchstäblich nur Funktionsaufrufe sind, befolgen Sie die Semantik von Funktionsaufrufen.

    
Oliver Charlesworth 14.07.2011 10:54
quelle
2

Wenn Sie das eingebaute Verhalten emulieren wollen, gibt es tatsächlich eine sehr einfache Lösung: Machen Sie den Rückgabewert const :

%Vor%

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.

    
Konrad Rudolph 14.07.2011 15:03
quelle
1

Am Ende ist MyInt::operator++(int) nur eine andere Methode. Es gelten die gleichen Regeln. Da Sie Methoden für rvalues ​​aufrufen können, können Sie operator++(int) für rvalues ​​aufrufen.

    
MSalters 14.07.2011 10:56
quelle
1

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 ++).

    
holgac 14.07.2011 11:00
quelle
1

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.

    
quelle