Was Sie zeigen, ist, dass die Verkettung von Operatoren zulässig ist.
X& x = getx().ref(); // OK
Der Ausdruck lautet 'getx (). Ref ();' und dies wird vor der Zuweisung zu 'x' vollständig ausgeführt.
Beachten Sie, dass getx () keine Referenz, sondern ein vollständig geformtes Objekt in den lokalen Kontext zurückgibt. Das Objekt ist temporär, aber nicht const, sodass Sie andere Methoden aufrufen können, um einen Wert zu berechnen, oder andere Nebenwirkungen auftreten können.
// It would allow things like this.
getPipeline().procInstr(1).procInstr(2).procInstr(3);
// or more commonly
std::cout << getManiplator() << 5;
Schauen Sie sich das Ende dieser Antwort an, um ein besseres Beispiel dafür zu finden
Sie können eine temporäre Referenz nicht an eine Referenz binden, da dadurch eine Referenz auf ein Objekt generiert wird, das am Ende des Ausdrucks zerstört wird, sodass Sie eine baumelnde Referenz erhalten (die unordentlich ist und der Standard nicht unordentlich mag).
Der von ref () zurückgegebene Wert ist eine gültige Referenz, die Methode berücksichtigt jedoch nicht die Lebensdauer des zurückgegebenen Objekts (da diese Informationen nicht in ihrem Kontext enthalten sein können). Sie haben im Grunde nur das Äquivalent von getan:
x& = const_cast<x&>(getX());
Der Grund, warum es in Ordnung ist, dies mit einer konstanten Referenz auf ein temporäres Objekt zu tun, besteht darin, dass der Standard die Lebensdauer des temporären Objekts auf die Lebensdauer der Referenz verlängert, sodass die Lebensdauer der temporären Objekte über das Ende der Anweisung hinaus verlängert wird.
Die einzig verbleibende Frage ist also, warum der Standard nicht zulassen möchte, dass Verweise auf Provisorien die Lebensdauer des Objekts über das Ende der Aussage hinaus verlängern.
Ich glaube, das liegt daran, dass es dem Compiler sehr schwer fallen würde, temporäre Objekte zu korrigieren. Dies wurde für konstante Verweise auf temporäre Elemente durchgeführt, da dies nur eine begrenzte Verwendung hat und Sie daher gezwungen sind, eine Kopie des Objekts zu erstellen, um etwas Nützliches zu tun, das jedoch einige eingeschränkte Funktionen bietet.
Denken Sie an diese Situation:
int getI() { return 5;}
int x& = getI();
x++; // Note x is an alias to a variable. What variable are you updating.
Die Verlängerung der Lebensdauer dieses temporären Objekts wird sehr verwirrend sein.
Während der folgenden:
int const& y = getI();
Gibt Ihnen Code, der intuitiv zu bedienen und zu verstehen ist.
Wenn Sie den Wert ändern möchten, sollten Sie den Wert an eine Variable zurückgeben. Wenn Sie versuchen, die Kosten für das Zurückkopieren des Objekts aus der Funktion zu vermeiden (da das Objekt anscheinend kopiert wurde (technisch gesehen)). Dann stören Sie sich nicht, der Compiler ist sehr gut in 'Rückgabewertoptimierung'