In der Programmiersprache C können R-Werte (rechte Werte) normalerweise nicht als L-Werte verwendet werden ( (linke Werte). Es gibt jedoch Ausnahmen von dieser Regel, wie der folgende Code zeigt:
<code class="cpp">class Y { public: explicit Y(size_t num = 0) {} }; int main() { Y(1) = Y(0); // WHAT?!? return 0; }</code>
Überraschenderweise wird dieser Code erfolgreich kompiliert, obwohl das vom Konstruktor Y(1) zurückgegebene Objekt ein R-Wert ist. In diesem Artikel werden die Gründe für dieses unerwartete Verhalten untersucht.
Der Schlüssel zum Verständnis, warum dieser Code gültig ist, liegt im Konzept synthetisierter Mitgliedsfunktionen. Für Klassen, die keinen expliziten Zuweisungsoperator definieren, generiert der Compiler einen Standardzuweisungsoperator. Dieser Standardoperator ist eine Mitgliedsfunktion, die als Parameter einen Verweis auf ein Objekt derselben Klasse akzeptiert.
Im obigen Beispiel wird der Zuweisungsoperator für Klasse Y wie folgt synthetisiert:
<code class="cpp">Y& Y::operator=(const Y& other);</code>
Bemerkenswert ist, dass dieser synthetisierte Zuweisungsoperator eine nicht konstante Memberfunktion ist. Dies bedeutet, dass es sowohl auf L-Werte (referenzierte Objekte) als auch auf R-Werte (nicht referenzierte Objekte) angewendet werden kann.
Wenn ein Objekt mit einem Konstruktor erstellt wird, der einen R-Wert zurückgibt, wird der Der Compiler generiert ein temporäres Objekt im Speicher. Dieses temporäre Objekt wird am Ende der Anweisung, in der es erstellt wurde, automatisch zerstört. Wenn der Konstruktor jedoch einen R-Wert vom Klassentyp zurückgibt, kann der synthetisierte Zuweisungsoperator die Lebensdauer des temporären Objekts verlängern.
Die Zuweisungsanweisung Y(1) = Y(0); ist syntaktischer Zucker für den folgenden Code:
<code class="cpp">Y(1).operator=(Y(0));</code>
Wie wir festgestellt haben, ist der synthetisierte Zuweisungsoperator „operator=“ für Klasse Y eine nicht konstante Memberfunktion, was bedeutet, dass er auf einen R-Wert angewendet werden kann. Daher kann der Compiler die Zuweisungsanweisung als Zuweisung an das vom Konstruktor Y(1) erstellte temporäre Objekt interpretieren.
Im Gegensatz zu dem, was normalerweise erwartet wird, ist eine Zuweisung möglich zu einem R-Wert des Klassentyps in C, da der Compiler nicht konstante Zuweisungsoperatoren für Klassen ohne explizit definierten Zuweisungsoperator synthetisiert. Diese synthetisierten Zuweisungsoperatoren verlängern die Lebensdauer temporärer Objekte, die von Konstruktoren erstellt wurden, und ermöglichen Zuweisungen an R-Werte.
Das obige ist der detaillierte Inhalt vonKönnen Sie einem R-Wert vom Klassentyp in C zuweisen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!