Zuweisung an R-Wert: Warum und wie?
Warum ist eine Zuweisung an einen Rückgabewert (R-Wert) eines Klassentyps möglich? Herkömmlicherweise gelten R-Werte als kurzlebig, da ihnen eine Speicheradresse fehlt. Wie können sie dann als linke Werte (L-Werte) verwendet werden?
Bedenken Sie den folgenden rätselhaften Code:
class Y { public : explicit Y(size_t num = 0) {} }; int main() { Y(1) = Y(0); // WHAT?!? return 0; }
Dieser Code lässt sich fehlerfrei kompilieren, auch wenn er unlogisch erscheinen könnte. Um zu verstehen, warum, müssen wir uns mit der Mechanik hinter Zuweisungsoperatoren befassen.
Synthetisierte Zuweisungsoperatoren
Wenn eine Klasse einen Zuweisungsoperator nicht explizit definiert, definiert der Compiler dies automatisch erzeugt einen. Der synthetisierte Operator kann eine von zwei Formen annehmen:
The Letztere Form ist bemerkenswert, weil sie auf R-Werte anwendbar ist. Daher generiert der Compiler im obigen Beispiel einen Zuweisungsoperator, der den vom Konstruktor Y(1) zurückgegebenen R-Wert akzeptieren kann.
Zuweisung an R-Werte verhindern
If Wenn Sie die Zuweisung an R-Werte verbieten möchten, können Sie den Zuweisungsoperator explizit mit Ref-Qualifizierern deklarieren. Auf diese Weise können Sie den Operator darauf beschränken, nur L-Werte zu akzeptieren. Zum Beispiel:
class Y { public : explicit Y(std::size_t num = 0); Y& operator=(Y const&) & = default; };
Durch die Verwendung des Ref-Qualifizierers & stellen Sie sicher, dass der synthetisierte Zuweisungsoperator nur für L-Werte verfügbar ist.
Das obige ist der detaillierte Inhalt vonZuweisung zu R-Werten: Verboten oder Feature? Warum können wir einen Rückgabewert zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!