Ви можете повернутися за посиланням, якщо впевнені, що об’єкт, на який посилається, не вийде за межі обсягу після виходу функції, наприклад, це посилання на глобальний об’єкт або функція-член, що повертає посилання на поля класу тощо.
Це правило повернення посилання однаково для посилань lvalue та rvalue. Різниця полягає в тому, як ви хочете використовувати повернене посилання. Як я бачу, повернення за посиланням rvalue є рідкістю. Якщо у вас є функція:
Type&& func();
Вам не сподобається такий код:
Type&& ref_a = func();
оскільки він фактично визначає ref_a як Type &, оскільки іменоване посилання rvalue є значенням, і фактичний рух тут виконуватися не буде. Це схоже на:
const Type& ref_a = func();
за винятком того, що фактичний ref_a є посиланням, яке не є const lvalue.
І це також не дуже корисно, навіть якщо ви безпосередньо передаєте func () іншій функції, яка приймає аргумент Type &&, оскільки вона все ще є іменованим посиланням всередині цієї функції.
void anotherFunc(Type&& t) {
}
anotherFunc(func());
Відносини func () та anotherFunc () більше схожі на "авторизацію", згідно з якою func () погоджується, що anotherFunc () може взяти у власність (або можна сказати "вкрасти") повернутий об'єкт із func (). Але ця угода дуже вільна. Недоступне посилання lvalue все ще може бути "викрадено" абонентами. Насправді функції рідко визначаються для прийняття аргументів посилання rvalue. Найпоширеніший випадок, що "anotherFunc" - це назва класу, а anotherFunc () - насправді конструктор переміщення.