Как я вижу, общее правило вообще не возвращать ссылки на r-значения из функций (за исключением редких особых случаев). Но как насчет методов класса?
В стандартной библиотеке C ++ есть пример возврата ссылки на r-значение из ref-квалифицированного метода класса r (std::optional<T>::operator*()
а также std::optional<T>::value()
методы std::optional<T>
учебный класс). Смотрите разделы 23.6.3 Шаблон класса необязательно [опционально.опционально] а также 23.6.3.5 Наблюдатели [необязательный. Наблюдатель] стандарта C ++ 17:
// 23.6.3.5, observers constexpr T&& operator*() &&; constexpr const T&& operator*() const&&; constexpr T&& value() &&; constexpr const T&& value() const&&;
Рассмотрим доступ к членам класса в целом. Скажем, у нас есть такой тип:
struct A {
int x;
};
Теперь давайте возьмем объект типа A
,
A a;
Теперь выражение (a)
это lvalue, и членский доступ (a).x
это также lvalue. Но выражение std::move(a)
это значение, и std::move(a).x
теперь также является rvalue (фактически, xvalue). Это поведение доступа членов на основном языке.
Теперь для пользовательских типов имеет смысл обеспечить пользовательское поведение, которое имитирует поведение основного языка. Мы можем сделать это, используя ref-квалифицированные функции-члены, которые могут различать, является ли экземпляр lvalue или rvalue. Когда целью функции-члена является предоставление доступа к подобъекту, тогда разумно возвращать этот подобъект как rvalue (в частности, xvalue), когда экземпляр является rvalue.
Общий совет, на который вы, вероятно, ссылаетесь, заключается в том, что вы не должны случайным образом возвращать rvalue-ссылки на некоторые произвольные объекты, которые вы не контролируете. В этом случае часто намного лучше возвращать копии, чтобы ваша функция могла использоваться независимо от контекстуальных предположений о времени жизни несвязанных объектов. Но когда вы говорите о функциях-членах, а рассматриваемый объект является экземпляром класса, у вас есть немного больше контроля, и возвращение значений xval может быть полезным инструментом.
Мета урок здесь заключается в том, что не всегда полезно спросить « <специфический синтаксис X> Это хорошая практика »в C ++. C ++ предоставляет вам множество инструментов, и иногда вам приходится говорить о дизайне в контексте.
Других решений пока нет …