Sie können als Referenz zurückkehren, wenn Sie sicher sind, dass das referenzierte Objekt nach dem Beenden der Funktion nicht den Gültigkeitsbereich verlässt, z. B. die Referenz eines globalen Objekts oder die Mitgliedsfunktion, die die Referenz auf Klassenfelder usw. zurückgibt.
Diese Rückgabereferenzregel ist sowohl für die l-Wert- als auch für die r-Wert-Referenz identisch. Der Unterschied besteht darin, wie Sie die zurückgegebene Referenz verwenden möchten. Wie ich sehen kann, ist die Rückkehr per rWert-Referenz selten. Wenn Sie Funktion haben:
Type&& func();
Sie werden solchen Code nicht mögen:
Type&& ref_a = func();
weil es ref_a effektiv als Typ definiert & da die benannte rWertreferenz ein lWert ist und hier keine tatsächliche Verschiebung durchgeführt wird. Es ist ganz wie:
const Type& ref_a = func();
mit der Ausnahme, dass die tatsächliche ref_a eine nicht konstante Wertreferenz ist.
Und es ist auch nicht sehr nützlich, selbst wenn Sie func () direkt an eine andere Funktion übergeben, die ein Type &&-Argument akzeptiert, da es sich immer noch um eine benannte Referenz innerhalb dieser Funktion handelt.
void anotherFunc(Type&& t) {
}
anotherFunc(func());
Die Beziehung zwischen func () und anotherFunc () ähnelt eher einer "Autorisierung", der func () zustimmt, dass anotherFunc () möglicherweise das zurückgegebene Objekt von func () übernimmt (oder Sie können sagen "stehlen"). Diese Vereinbarung ist jedoch sehr locker. Eine nicht konstante Wertreferenz kann weiterhin von Anrufern "gestohlen" werden. Tatsächlich werden Funktionen selten definiert, um rvalue-Referenzargumente zu verwenden. Der häufigste Fall ist, dass "anotherFunc" ein Klassenname ist und anotherFunc () tatsächlich ein Verschiebungskonstruktor ist.