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
Patricia ArquetteOriginal
2024-10-29 13:58:02948Durchsuche

 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;
}

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;
};

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!

Stellungnahme:
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