„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Können Sie einem RValue von Klassentyp in C ++ zuweisen?

Können Sie einem RValue von Klassentyp in C ++ zuweisen?

Gepostet am 2025-03-24
Durchsuche:362

 Can You Assign to an Rvalue of Class Type in C  ?

Zuweisungen zum Klassen-Typ rvalues ​​

Übersicht

in der C-Programmiersprache, rvalues ​​(rechte Handwerte) können typischerweise nicht als LVALUES (linke Werte) verwendet werden. Es gibt jedoch Ausnahmen von dieser Regel, wie aus dem folgenden Code dargestellt:

class Y {
public:
    explicit Y(size_t num = 0) {}
};

int main() {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}

überraschenderweise kompiliert dieser Code erfolgreich, obwohl das vom Konstruktor y (1) zurückgegebene Objekt ein RValue ist. In diesem Artikel wird die Gründe für dieses unerwartete Verhalten untersucht.

Zuweisung zum Klassen -Typ rvalues ​​

Der Schlüssel zum Verständnis, warum dieser Code gültig ist, liegt im Konzept der synthetisierten Mitgliederfunktionen. Für Klassen, die einen Zuordnungsoperator nicht explizit definieren, generiert der Compiler einen Standard -Zuordnungsoperator. Dieser Standardoperator ist eine Mitgliedsfunktion, die einen Bezug auf ein Objekt derselben Klasse wie sein Parameter nimmt.

Im obigen Beispiel wird der Zuordnungsoperator für die Klasse y wie folgt synthetisiert:

Y& Y::operator=(const Y& other);

Constructor -Return -Werte

, wenn ein Objekt unter Verwendung eines Konstruktors erstellt wird, der einen RValue zurückgibt, genügt der kompilierende ein temporäres Objekt im Gedächtnis. Dieses temporäre Objekt wird am Ende der Erstellung automatisch zerstört. In dem Fall, in dem der Konstruktor jedoch ein RValue des Klassentyps zurückgibt, kann der synthetisierte Zuordnungsoperator die Lebensdauer des temporären Objekts erweitern. ist syntaktischer Zucker für den folgenden Code:

y (1) .operator = (y (0));

Wie wir festgelegt haben, ist der synthetisierte Zuweisungsoperator = für die Klasse y eine nicht konstante Mitgliedsfunktion, dh sie kann auf eine rvalue angewendet werden. Daher kann der Compiler die Zuordnungsanweisung als Zuweisung an das vom Konstruktor y (1) erstellte temporäre Objekt interpretieren. Diese synthetisierten Zuordnungsoperatoren erweitern die Lebensdauer temporärer Objekte, die von Konstruktoren erstellt wurden, und ermöglicht Zuweisungen an Rvalues.

.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3