Единственная причина, которую я вижу, состоит в том, чтобы избежать создания висячей ссылки, когда объект является результатом предварительного значения:
Widget foo();
auto&& x = foo().data();
Если foo().data()
вернул rvalue-ссылку на variable
член, x
будет висячей ссылкой, потому что результирующий объект foo()
уничтожается в конце инициализации x
(конец полное выражение).
С другой стороны, когда data()&&
возвращается по значению, x
связан с временной материализацией, которая будет иметь то же время жизни, что и x
. Таким образом, висячие ссылки избегают.
Этот тип возврата для data() &&
не является идиоматическим в C ++. Обычно функции доступа возвращают ссылку, и такой сценарий использования, как приведенный выше, вероятно, вызывает «тревогу свисающей ссылки» любого рецензента кода.
Это определение data()&&
разумно, но оно нарушает общее соглашение.