据我所知,一般规则是根本不从函数返回右值引用(极少数特殊情况除外)。但是类方法呢?
C++ 标准库中有一个从类的右值引用限定方法返回右值引用的示例(std::optional<T>::operator*() and std::optional<T>::value()的方法std::optional<T>
班级)。参见章节23.6.3 类模板可选 [可选.可选] and 23.6.3.5 观察者[可选.observe]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)
是一个左值,并且是成员访问(a).x
也是一个左值。但表达std::move(a)
是一个右值(实际上是一个x值),并且std::move(a).x
现在也是一个右值(实际上是一个x值)。这就是核心语言中成员访问的行为。
现在,用户定义类型提供模仿核心语言行为的用户定义行为是有意义的。我们可以通过使用 ref 限定成员函数来做到这一点,它可以区分实例是左值还是右值。当成员函数的目的是提供对子对象的访问时,当实例是右值时,将该子对象作为右值(具体来说,xvalue)返回是合理的。
您可能提到的一般建议是,您不应该随机返回对某些您无法控制的任意对象的右值引用。在这种情况下,返回副本通常会更好,这样您的函数就可以独立于对不相关对象的生命周期的上下文假设而使用。但是,当您谈论成员函数并且所讨论的对象是类实例时,您有更多的控制权,并且返回 xvalues 可能是有用的工具。
这里的一个元教训是,在 C++ 中询问“ 是否是好的实践”并不总是有用。 C++ 给了你很多工具,有时你必须结合上下文来谈论设计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)