Warum ist eine Zuweisung an R-Werte vom Klassentyp möglich?
In C können Zuweisungen an R-Wert-Ausdrücke im Allgemeinen nicht durchgeführt werden. Dieses Verhalten scheint jedoch im folgenden Codeausschnitt verletzt zu sein:
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
Erklärung:
Entgegen den anfänglichen Erwartungen wird dieser Code erfolgreich kompiliert. Der Grund liegt in der impliziten Synthese von Mitgliedsfunktionen, insbesondere des Zuweisungsoperators. Gemäß dem C-Standard (Abschnitt 12.8 [class.copy], Absatz 18) synthetisiert der Compiler einen, wenn ein Zuweisungsoperator nicht deklariert oder als gelöscht markiert ist. Für den Klassentyp Y hat der synthetisierte Zuweisungsoperator die folgenden Signaturen:
Beachten Sie, dass diese Signaturen vor dem Parameter kein Ref-Qualifizierer (&) enthalten. Daher ist der synthetisierte Zuweisungsoperator auf R-Wert-Ausdrücke anwendbar.
Dieses Verhalten ermöglicht die Zuweisung an temporäre Objekte, die durch Aufruf des Konstruktors Y(1) erstellt wurden.
Verhinderung von Links -Vorübergehende Handseite:
Um zu verhindern, dass auf der linken Seite einer Aufgabe ein temporäres Objekt erstellt wird, können Sie eine Technik namens „Kopierelision“ verwenden. Dazu gehört die Deklaration des Zuweisungsoperators mit einem Ref-Qualifizierer, wie im folgenden geänderten Code gezeigt:
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
Mit dieser Änderung ist der synthetisierte Zuweisungsoperator nicht mehr auf R-Werte anwendbar.
Das obige ist der detaillierte Inhalt vonWarum können wir R-Werten vom Klassentyp in C zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!