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

2023-12-06

据我所知,一般规则是根本不从函数返回右值引用(极少数特殊情况除外)。但是类方法呢?

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(使用前将#替换为@)

从右值引用限定方法返回右值引用是一个好习惯吗? 的相关文章

随机推荐

  • 在 JavaScript 中将值数组转换为对象数组(键值)对

    有没有一种简单的方法来转换值数组 dataset 5 10 13 对象数组 其中每个对象都是一个键值对 dataset key 0 value 5 key 1 value 10 key 2 value 13 此示例是 Scott Murra
  • 无法再在 golang 中加载包

    我似乎无法弄清楚这一点 我正在使用我的 Windows 电脑进行开发并部署到 Linux 机器上 一切都很好 突然间我无法再编译任何东西 甚至无法编译一个简单的 hello world 程序 可能是在 Windows 更新之后 我所做的一切
  • 计算 scipy csr 矩阵中的欧氏距离

    我需要计算存储在 csr 稀疏矩阵中的所有点和一些点列表之间的欧几里德距离 对我来说 将 csr 转换为密集型会更容易 但由于内存不足而无法转换 所以我需要将其保留为 csr 例如我有这个data csr稀疏矩阵 同时查看 csr 和稠密
  • 使用 PDFBox 绘制透明线

    我想在 PDFBox 中用透明线绘制线条和多边形 这是我如何绘制蓝线的一些示例代码 但我无法弄清楚如何更改颜色的 alpha 值 PDDocument document new PDDocument PDPage page new PDPa
  • Selenium (Python) >> selenium.common.exceptions.NoSuchFrameException:

    我一直在尝试输入 iframe 并在 Safari 中的搜索栏 标签 中写入文本 我无法发布 html 因为它太大而且不是我的 但这是 iframe 代码 Content of the iframe
  • 如何获取嵌套括号之间的文本?

    用于获取括号 之间文本的正则表达式 我已尝试过 但没有得到正则表达式 对于这个例子 Regex Match script Value 例子 add mul a add b c d e sub f g Output gt 1 mul a ad
  • 扩展 jQuery 不起作用...?

    我不知道如何扩展 jQuery 我有以下代码 jQuery fn extend whatever function alert yeah 这应该给我一个 whatever功能 不是吗 但是当我检查它或尝试运行它时 zilch 看看这个小提琴
  • ChartJS 在刻度之间放置 y 轴标签

    I have the following graph However i d like to shift the y axis labels to be the following 是否可以使用 ChartJS 将 y 轴标签移动到刻度线之
  • 为什么这里不调用复制构造函数

    stri stri char s constructor used to initilize object with constant string stri stri s1 copy constructor performs member
  • 减去 Spark 数据框中带有 null 的两列

    我是 Spark 新手 我有数据框 df Column1 Column2 Sub 1 2 1 4 null null
  • 删除 SQLite 中的重复条目

    我有一张包含重复条目的表 除了primary key之外 所有条目都是相同的 这些条目甚至存储一个唯一的 ID 如果条目重复 该 ID 将是相同的 secondID 即使看起来并不难 我在 Android 中想出一个 rawQuery 来根
  • 使用多图设置图之间的边距

    为了显示多个图 我使用 multiplot http www cookbook r com Graphs Multiple graphs on one page ggplot2 现在我有两个图 它们共享相同的 x 轴范围 并且绘制在彼此上方
  • 我在尝试使用 pygame 创建声音时遇到错误

    我在尝试使用 pygame 添加声音时遇到错误 我已将所有 wav 文件与 python 脚本放在同一目录中 这是我第一次使用 pygame 所以我一无所知 import pygame pygame init pygame mixer in
  • C# 面板因碰撞而移动

    我是 C 和 Winforms 的新手 尝试制作一个移动面板 它应该向右移动直到窗口的尽头 然后向左移动 它应该从一侧弹到另一侧 但经过几个小时的尝试后 唯一发生的事情是它向左移动并停止了 使用此表单工具 Timer tmrMoveBox
  • Javascript 密码正则表达式

    我正在编写用于在 Javascript 中验证密码的正则表达式 限制条件是 密码必须包含至少一个大写字符 密码必须至少包含一个特殊字符 经过反复试验和在网上进行一些搜索 我发现这是可行的 A Z 有人可以解释一下这个表达式中提到大写字母和特
  • 从 Google App Engine 应用程序运行 Google Dataflow 管道?

    我正在使用 DataflowPipelineRunner 创建数据流作业 我尝试了以下场景 不指定任何机器类型 配g1小机 与 n1 highmem 2 在上述所有场景中 输入是来自 GCS 的文件 该文件非常小 KB 大小 输出是 Big
  • 将顶点行折叠为嵌套表类型(按 ID 聚合)

    测试数据 with cte as select 1 as id 100 as x 101 as y from dual union all select 1 as id 200 as x 201 as y from dual union a
  • 如何将 Java ZonedDateTime 转换为具有默认时区偏移量的 OffsetDateTime?

    假设我的 ZonedDateTime 为2018 10 30T18 04 58 874Z 我怎样才能将其转换为 OffsetDateTime2018 10 30T13 04 58 874 05 00 我希望偏移量是默认 系统偏移量 例如从O
  • 将 P/Invokes 移至 NativeMethods 类,因为它是 P/Invoke 方法消息

    有人可以建议我与此消息有什么关系吗 CA1060 将 P Invoke 移至 NativeMethods 类 因为它是 P Invoke 方法 UControl InternetGetConnectedState out int int 应
  • 从右值引用限定方法返回右值引用是一个好习惯吗?

    据我所知 一般规则是根本不从函数返回右值引用 极少数特殊情况除外 但是类方法呢 C 标准库中有一个从类的右值引用限定方法返回右值引用的示例 std optional