Heim > Backend-Entwicklung > C++ > Warum können wir R-Werten vom Klassentyp in C zuweisen?

Warum können wir R-Werten vom Klassentyp in C zuweisen?

Patricia Arquette
Freigeben: 2024-10-29 13:58:02
Original
949 Leute haben es durchsucht

 Why Can We Assign to Rvalues of Class Type in C  ?

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;
}
Nach dem Login kopieren

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:

  • Y& Y::operator=(Y const&)
  • Y& Y::operator=(Y&)

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;
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage