从r值ref ref限定方法返回r值引用是一个好习惯吗?

时间:2018-01-28 16:14:10

标签: c++ return-value rvalue-reference c++17 ref-qualifier

正如我所看到的,一般规则是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>

1 个答案:

答案 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 ++为您提供了许多工具,有时您必须在上下文中讨论设计。