正如我所看到的,一般规则是not to return r-value references from functions at all(罕见的特殊情况除外)。但是类方法呢?
C ++标准库中有一个示例,它从类{(1 {1}}的类std::optional<T>::operator*()
和std::optional<T>::value()
方法的r值ref ref限定方法返回r值引用类)。请参阅 23.6.3类模板可选[optional.optional] 和 23.6.3.5 C ++ 17标准的观察者[optional.observe] :
std::optional<T>
答案 0 :(得分:2)
一般考虑类成员访问权限。假设我们有这样的类型:
struct A {
int x;
};
现在让我们选择A
类型的对象。
A a;
现在表达式(a)
是左值,成员访问(a).x
也是左值。但是表达式std::move(a)
是一个右值,而std::move(a).x
现在也是一个右值(实际上是一个x值)。这是核心语言中成员访问的行为。
现在,用户定义的类型提供模仿核心语言行为的用户定义行为是有意义的。我们可以通过使用ref-qualified成员函数来实现这一点,这些函数可以区分实例是左值还是右值。当成员函数的目的是提供对子对象的访问时,当实例是右值时,将该子对象作为右值(特别是xvalue)返回是合理的。
您可能提到的一般建议是,您不应随意返回对您无法控制的任意对象的右值引用。在这种情况下,返回副本通常要好得多,这样您的函数就可以独立于无关对象生命周期的上下文假设使用。但是当你谈论成员函数并且有问题的对象是类实例时,你有更多的控制权,返回xvalues可能是有用的工具。
这里的一个元课程是,询问&#34;&lt;特定语法X&gt;是否总是有用的。是一种很好的做法&#34;在C ++中。 C ++为您提供了许多工具,有时您必须在上下文中讨论设计。