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

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

如我所见,一般规则是 not to return r-value references from functions at all (极少数特殊情况除外)。但是类方法呢?

C++ 标准库中有一个从类的右值引用限定方法(std::optional<T>::operator*() 类的 std::optional<T>::value() std::optional<T> 方法)返回右值引用的示例。请参阅 C++17 标准的 23.6.3 Class template optional [optional.optional]23.6.3.5 Observers [optional.observe] 部分:

// 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) 是一个右值(实际上是一个 xvalue),而 std::move(a).x 现在也是一个右值(实际上,一个 xvalue)。这是核心语言中成员访问的行为。

现在,用户定义类型提供模仿核心语言行为的用户定义行为是有意义的。我们可以通过使用 ref 限定的成员函数来做到这一点,它可以区分实例是左值还是右值。当成员函数的目的是提供对子对象的访问时,当实例是右值时,将该子对象作为右值(特别是 xvalue)返回是合理的。

您大概指的一般建议是您不应该随机返回对某些您无法控制的任意对象的右值引用。在这种情况下,返回拷贝通常要好得多,这样您的函数就可以独立于不相关对象的生命周期的上下文假设来使用。但是当你谈论成员函数并且所讨论的对象是类实例时,你有更多的控制权,返回 xvalues 可能是有用的工具。

这里的元教训是,在 C++ 中询问“ 是否是好的做法”并不总是有用。 C++ 给了你很多工具,有时你不得不在上下文中谈论设计。

关于c++ - 从 r 值引用限定方法返回 r 值引用是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48488436/

相关文章:

c++ - 使用 Arduino/C++ 从 SD 卡上的文件中读取一个 float

javascript - 如何将变量传递给函数并返回值?

c++ - vector 返回空c++

c++ - 为什么右值引用参数与重载决策中的 const 引用匹配?

c++ -/usr/bin/ld : cannot find -lGL (Ubuntu 14. 04)

c++ - 如何创建模板 vector ?

android - 警告 : shared library text segment is not shareable

sql-server - sql过程中返回值为null

c++ - 调用基类 move ctor [C++0x]

c++ - 是否有任何理由使用右值引用来重载运算符?