Ich bin neugierig, wie diese Funktion genau funktioniert. Denken Sie an etwas wie
std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }
Dieser Code lässt sich auch bei einem reinen Verschiebetyp gut kompilieren, da der Compiler ihn implizit verschiebt. Aber logischerweise wäre die Bestimmung, ob sich das Ergebnis auf eine lokale Variable bezieht oder nicht, für jeden Rückgabeausdruck die Lösung des Halting-Problems - und wenn der Compiler einfach alle lokalen Variablen als rWerte im Rückgabeausdruck behandeln würde, dann wäre dies problematisch, da die Variable in diesem einen Ausdruck mehrfach referenziert werden kann. Selbst wenn eine lokale Variable nur einen direkt Verweises können Sie nicht beweisen, dass er nicht noch andere indirekte Aliasnamen hat.
Woher weiß der Compiler also, wann er den Return-Ausdruck verlassen muss?