返回常量引用和右值引用之间的区别

2024-04-25

如果我没记错的话,我认为 const 引用和右值引用都可以绑定到右值。返回前者的函数和返回后者的函数之间有什么实际区别吗?

编辑。我无法修改前者,但为什么我会对修改右值感兴趣?是否有意义?


A const左值引用可以绑定到任何东西。右值引用只能绑定到非const右值。

            non-const lvalue   const lvalue   non-const rvalue   const rvalue
const T&    yes                yes            yes                yes
T&&         no                 no             yes                no

正如您所看到的,它们非常不同。

此外,如果函数调用返回左值引用,则该表达式是左值,但如果函数调用返回对象的右值引用,则该表达式是xvalue。

如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值;如果结果类型是对对象类型的右值引用,则函数调用是 xvalue;否则是纯右值。

至于何时想要修改右值 - 这正是移动语义的全部内容。考虑以下函数调用:

void func(std::string);

func(std::string("Hello"));

表达方式std::string("Hello")是创建临时对象的右值。当初始化时std::string带有此右值的参数,它将选择采用右值引用的构造函数 -移动构造函数。然后,该构造函数从右值中窃取内容,这通常比执行完整复制要快得多。我们可以从中偷窃,因为我们know这是暂时的。

至于什么时候该回来const左值引用或右值引用:

  • 返回一个const当您想要授予读取“内部”对象(可能是类的成员)的访问权限,但不允许人们修改它时,最常使用左值引用。

  • 当您希望允许调用代码从“内部”对象(可能是类的成员)移动时,返回右值引用是最常用的(根本不常见)。因此,它们不是从临时返回的对象中移动(就像按值返回时那样),而是从字面上从内部对象中移动。

    这也可以通过非const左值引用,但随后他们必须显式地std::move it.

因此,您不太可能需要返回右值引用。

不是那个std::forward http://en.cppreference.com/w/cpp/utility/forward有一个返回类型看起来像T&&。然而,这是具有欺骗性的,因为它可能是也可能不是右值引用,具体取决于T. See 通用参考 http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回常量引用和右值引用之间的区别 的相关文章

  • ASP MVC4 - 通过视图模型传递列表以查看

    我有一个模型人物 其中包括出生日期等字段 我想将所有人的列表以及每个人的计算年龄传递给视图 因此 视图模型 public class vm PersonList public Person Person get set public int
  • 将信号/槽(QObject)添加到 QGraphicsItem:性能受到影响?

    我想将信号 槽添加到 QGraphicsItem 以便我可以从另一个线程访问 QGraphicsItemObjects 我知道有两个选项 使用 QGraphicsObject 或从 QObject 和 QGraphicsItem 继承 使用
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • C++ 中的可变参数函数声明中省略了逗号

    我习惯于这样声明可变参数函数 int f int n 读书时C 编程语言我发现书中的声明省略了逗号 int f int n the comma has been omitted 这个语法似乎是 C 特定的 因为当我尝试使用 C 编译器编译它
  • 我可以在 WinRT / Windows 8 Store 应用程序中绑定 DynamicObject

    我有以下代码 public class MyClass DynamicObject INotifyPropertyChanged Dictionary
  • C# 中的 DateTime.Parse 抛出异常

    我不知道为什么抛出异常 这是工作代码 DateTime Parse 1 12 2012 12 00 00 AM 这是抛出异常的一个 DateTime Parse 1 13 2012 12 00 00 AM 抛出的异常是 格式异常 包括此消息
  • 仅使用 1 行 C++ 初始化 2d 向量

    我需要能够初始化一个 2D 向量 int同一条线我在其中创建它 更具体地说 我必须创建一个3x2大小 2D 向量并将其所有值设置为 0 仅使用1行代码 有没有一种方法可以在不使用 for 循环和几行代码的情况下完成此操作 尝试这个 std
  • 从文本文件中读取所有内容 - C

    我正在尝试从文本文件中读取所有内容 这是我写的代码 include
  • 相当于一个允许重复键的排序字典

    我需要一个数据结构 可以通过与对象关联的浮动键对对象进行排序 从低到低的在前 问题是键代表成本 所以经常有重复 我不关心这一点 因为如果两个具有相同的成本 我只会抓住第一个 因为它没有区别 问题是编译器抱怨 是否有一种数据结构的行为方式相同
  • 将迭代器取消引用到临时范围时出现非指针操作数错误

    Using auto empty line auto str return str size 0 我们做得到 auto line range with first non empty ranges view drop while range
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 使用 PrimarySearcher.FindAll() 时出现内存泄漏

    我也有一个使用插件和应用程序域长时间运行的服务 并且由于使用目录服务而出现内存泄漏 请注意 我正在使用 system directoryservices accountmanagement 但据我了解 它使用相同的底层 ADSI API 因
  • 在 Winforms 中,PreviewKeyDown() 从未针对任何键触发

    我最初试图让我的程序获取箭头键 上 下 左 右 的输入 但发现在 KeyDown 中这些键从未出现过 后来我发现我可以通过进入 PreviewKeyDown 函数并设置来启用箭头键 e IsInputKey true 及其周围的任何条件和逻
  • 创建 .ICS 文件,添加到 Outlook

    我正在创建一个简单的应用程序 允许用户下载 ICS 文件 并将其导入到他们选择的日历应用程序 站点中 我对创建过程感到满意 但对在 Outlook 中打开它们有疑问 将使用C ASP NET进行开发 当我打开一个日历时 它会添加一个新日历
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • ASP.NET 5 (vNext) - 配置

    我正在尝试学习 ASP NET 5 我在 Mac OS X 上使用它 此时 我有一个如下所示的 config json 文件 配置 json AppSettings Environment dev DbSettings AppConnect
  • 从原始 URL 获取重定向 URL

    我的数据库中有一个表 其中包含一些网站的 URL 我必须打开这些 URL 并验证这些页面上的一些链接 问题是某些 URL 被重定向到其他 URL 对于这样的 URL 我的逻辑是失败的 有什么方法可以传递原始 URL 字符串并获取重定向的 U
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考
  • 捕获 System.Exception 总是不好的做法吗?

    请考虑下面的代码 它抛出三个不同的异常 即 System Configuration ConfigurationErrorsException System FormatException and System OverflowExcept

随机推荐

  • 反馈两个进程的stdin和stdout

    我有两个进程通过标准输入和标准输出相互连接 假设我有进程 A 和进程 B B 的标准输出需要输入到 A 的标准输入中 A 的标准输出需要输入到进程 B 的标准输出中 是否有一种简单的方法可以用简单的命令来表达这种关系 或者是否有一个基本的
  • 如何摆脱 Firefox 中用作链接的边框和图像?

    我认为奇怪的问题更多的是我不确定它叫什么 但我有一个包含在链接中的 img example li a href link img a li Now I have the css border rules all to 0 So their
  • 使用 JNDI 在 Tomcat 上设置 WMQ V8 连接工厂

    目前 我们的 Tomcat 配置 JNDI 是基于当前有效的此建议 如何使用 JMS 和 JNDI 连接到 Websphere MQ MQ 系列 服务器 http wiki apache org tomcat HowTo How do I
  • Bitbucket 和 Azure DevOps 之间的集成

    我的要求是我想将我的 Bitbucket 存储库与 Azure DevOps CI 服务器集成 以便一旦我将代码推送到 bitbucket 存储库中 我的管道就会在 Azure DevOps CI 服务器中触发 因为我已经在 Bitbuck
  • 检查用户是否登录ajax页面更改

    作为我正在构建的网络应用程序的一部分 我需要在用户更改页面时检查用户是否已登录 在普通的非ajax站点上 这很容易 因为我可以将PHP会话条件语句放在标头中 并且在每次页面更改时调用的标头将确定是否显示登录页面 但将其视为头文件仅在 aja
  • openssl-使用密钥和 IV 解密 Base64 字符串

    我正在尝试解密已在 openssl 中使用 aes256 加密的 base64 字符串 我获得了会话密钥和 IV 它们是用我的密钥加密的 我将它们转换为十六进制 以便可以使用以下 openssl 命令 openssl enc d aes25
  • 具有专用启动键的 DynamoDB 全球二级索引

    通过全局二级索引查询 DynamoDB 表时是否可以指定独占开始键 我正在使用 aws java sdk 版本 1 6 10 并使用QueryExpression and a DynamoDBMapper 这是我想做的事情的要点 Mappe
  • 将自定义 DQL 函数与 Doctrine 和 Symfony2 一起使用时出错

    我使用 Symfony 2 和 ORM Doctrine 我想创建并注册自定义 DQL 函数 其实我想用SQL函数 CAST http dev mysql com doc refman 5 5 en cast functions html
  • NSNotification 被 UITabBarController 多次调用

    我有一个UITabBarController 有 4 个选项卡 这些选项卡中的每一个都是一个单独的UIViewController 我在这 4 个使用 VC 的每一个上都有对象NSNotification按下某个物体后执行动作 4 个 VC
  • Android 上的热点/网络共享模式下的组播支持

    我有一个原型 Android 应用程序 它正在侦听多播数据包以 发现 要与之通信的客户端 套接字设置类似于 InetAddress group InetAddress getByName 228 1 2 3 MulticastSocket
  • 在 Azure Function App 中配置 Application Insights 的云角色名称

    我想设置从我的 Azure Function App v2 发送到应用程序洞察的遥测数据的 cloud rolename 我的 host json 中的 AI 配置如下所示 applicationInsights sampling isEn
  • 如何解析具有多个小数点的字符串

    我想将诸如 10 0 20 之类的字符串解析为数字 以便比较 C net 中具有相同格式的另一个字符串 例如 我将比较这两个数字 看看哪个数字小于另一个数字 如果 10 0 30 我不确定应该使用哪种解析方法 因为在这种情况下 decima
  • 如何从元组数组创建字典?

    假设我有可以识别的对象数组 并且我想从中创建字典 我可以轻松地从数组中获取元组 如下所示 let tuples myArray map return 0 id 0 但我看不到字典的初始化程序来获取元组数组 我错过了什么吗 我是否已经为此功能
  • 使用 git 在整个文件上“接受他们的”或“接受我的”的简单工具

    我不需要可视化合并工具 而且我也不想必须 vi 冲突文件并手动在 HEAD 我的 和导入的更改 他们的 之间进行选择 大多数时候 我要么想要他们的所有更改 要么想要我的所有更改 通常这是因为我的更改使其上升并通过拉动返回给我 但可能在各个地
  • 等列值数量求和的公式

    给定一个包含两列的电子表格 例如 A 和 B 每列下面包含 n 个值 所有文本 有没有一个公式可以让我只填充一个包含 A 列和 B 列中相等值数量的单元格 Example A B 1 M M 2 L M 3 L L 4 M M 5 M L
  • 无法从 cin.get() 获取 char

    我正在做一些关于 C 的初学者练习 这让我很困惑 我可以输入数字 但之后无法选择输入字符 并且会跳到最后一行 我知道我可以使用 cin gt gt 符号 但我想知道为什么这不起作用 include
  • 检查 canAuthenticateAgainstProtectionSpace 中的公钥

    我被要求根据已知值检查公钥canAuthenticateAgainstProtectionSpace 委托回调NSURLConnection http developer apple com library mac documentatio
  • 在网站上以多种形式输入密钥

    我有一个有两种表格的网站 一个用于搜索 另一个用于登录 当我使用回车键提交时 搜索总是被调用 因为它是页面上的第一个表单 我想要做的是对回车键进行编程 以在某个文本框获得焦点时单击某个按钮 我使用 asp textbox 和 asp but
  • 响应 django CORS 问题

    错误详情 单击按钮时生成了两个请求 到目前为止我搜索了什么 Axios 通过 Django REST Framework 被 CORS 策略阻止 https stackoverflow com questions 55366740 axio
  • 返回常量引用和右值引用之间的区别

    如果我没记错的话 我认为 const 引用和右值引用都可以绑定到右值 返回前者的函数和返回后者的函数之间有什么实际区别吗 编辑 我无法修改前者 但为什么我会对修改右值感兴趣 是否有意义 A const左值引用可以绑定到任何东西 右值引用只能