rvalues, lvalues und Zuweisungen
-
Hallo, ich suche nach einer definitiven Antwort auf folgende Frage.
struct S { //... }; S f() { return S(); } int main() { S s; f() = s; }Ist das erlaubt?
3.10§5 sagt, f() ist ein rvalue-Ausdruck. 5.17§1 sagt, die linken Ausdrücke in Zuweisungen müssen modifiable lvalues sein. Scheint eindeutig. Andererseits ist die Zuweisung bei nutzerdefinierten Typen eine Memberfunktion, warum soll man die nicht aufrufen dürfen? Solange f() kein
const Szurückliefert ... Compiler scheinen das meistens auch so zu sehen.
-
Jo, geht. f() liefert ein temporäres S Objekt. Für das temporäre S Objekt wird dann der (implizite oder explizite) Zuweisungsoperator aufgerufen. Dann wird das Objekt verworfen.
Mach in Deinem struct mal S& operator=(const S& obj) private. Dann gehts nicht mehr.
-
Überladene Operatorfunktionen unterliegen nicht den gleichen Beschränkungen wie die eingebauten Operatoren hinsichtlich der Operanden (13.5/7) - ein lvalue wird nur benötigt, wenn die betreffende Funktionen eine nicht-const Referenz als Parameter hat. Die Zuweisung zwischen Klassenobjekten wird in jedem Falle durch eine überladene Funktion ausgeführt (5.17/4).
Edit: 5/2 Satz 3 ist ein besserer Verweis (13.5/7 meint Semantik nicht Syntax).
-
ja, es ist erlaubt.
ich hab im moment keine zeit, die relevanten stellen im standard herauszusuchen, aber 5.17/1 bezieht sich auf built-in operatoren, nicht auf automatisch generierte.
-
camper schrieb:
Edit: 5/2 Satz 3 ist ein besserer Verweis (13.5/7 meint Semantik nicht Syntax).
Ah danke, das ist es.

-
huch, hätte ich zuerst nachsehen sollen, ob nicht schon jemand geantwortet hat

das ist übrigens auch der grund, warum manche menschen den rückgabewert ihrer operatoren konstant machen wollen. aber fang nicht an, mit camper darüber zu streiten
