为什么临时对象可以绑定到const引用?

2023-12-19

问题来源: https://stackoverflow.com/a/36955656/4784683

唯一失败的情况是通过非常量引用传递参数, 因为临时变量无法绑定到它。

void DrawLine(const Vector& v1, const Vector& v2);

如果对象是临时的,为什么要进行引用const对临时对象的生命周期有什么影响?

我想我也没有完全理解在参数中创建的临时对象的存在范围。


如果对象是临时的,为什么要进行引用const对临时对象的生命周期有什么影响?

在当前上下文中,问题不在于对象的生命周期,而在于是否可以修改它。

说你打电话。

foo(10);

保存值的对象10调用中不应由函数修改。如果接口为foo is:

void foo(int& ref);

实施是公平的foo as:

void foo(int& ref)
{
   ref = 20;
}

这将是一个问题foo(10)。如果有的话,这不会有问题foo uses a const&.

void foo(int const& ref)
{
   ref = 20; // Not allowed.
}

From C++11 标准,临时对象/1 https://timsong-cpp.github.io/cppwp/n3337/class.temporary#1

类类型的临时对象是在各种上下文中创建的:将引用绑定到纯右值 ([dcl.init.ref] https://timsong-cpp.github.io/cppwp/n3337/dcl.init.ref),返回纯右值 ([stmt.return] https://timsong-cpp.github.io/cppwp/n3337/stmt.return),创建纯右值的转换,...

和来自C++11 标准,参考文献/5.2 https://timsong-cpp.github.io/cppwp/n3337/dcl.init.ref#5.2:

-- 否则,该引用应为非易失性 const 类型的左值引用(即 cv1 应为 const),或者该引用应为右值引用。

临时变量只能绑定到纯右值的引用。这种引用的类型必须是const合格的左值引用或右值引用。

MS Visual Studio 编译器允许绑定非const对临时对象的引用,但它不受标准认可。

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

为什么临时对象可以绑定到const引用? 的相关文章

随机推荐

  • Facebook Messenger API“无法验证 URL”

    我正在尝试设置 Facebook Messenger API 但在尝试添加 WebHook 时收到此错误 无法验证该 URL 回调验证失败 出现以下错误 curl errno 60 curl error SSL证书问题 无法获取本地颁发者证
  • init] 自动引用计数

    我知道我应该使用 ObjectClass tmpObject ObjectClass alloc init realObject tmpObject tmpObject release 初始化realObject where realObj
  • 如何遍历NLTK树对象?

    给定一个括号内的解析 我可以将其转换为 NLTK 中的 Tree 对象 如下所示 gt gt gt from nltk tree import Tree gt gt gt s ROOT S NP NNP Europe VP VBZ is P
  • JSF2 静态资源管理——组合、压缩

    有谁知道动态组合 缩小所有 h outputStylesheet 资源 然后在渲染阶段组合 缩小所有 h outputScript 资源的方法 混合 缩小的资源可能需要使用基于组合资源字符串或其他内容的键进行缓存 以避免过度处理 如果这个功
  • 位置:粘性 - 与 javascript 高度调整结合使用时滚动弹跳

    玩完之后position sticky有一段时间 我开始实现粘性导航 并遇到了这个有趣但令人沮丧的滚动弹跳问题 这是许多网站上常见的导航行为类型 传统上您会使用 JavaScript 来计算页面中相对元素的偏移量 当元素到达窗口顶部时 将添
  • 在conda环境中安装tensorrt

    我正在尝试在 conda env 中安装tensorrt 并且通过 conda navigator 在我的环境中安装了 cudatoolkit 和 cudnn 我还更新了我的 pip 和 setuptool 但出现以下错误 我应该怎么办 E
  • 如何替换上传文件的文件名中的空格

    我正在制作一个 SWF 上传器并已完成 HTML 表单 它工作得很好 直到我上传名称中包含空格的 SWF 文件 如何用下划线替换空格 我努力了 str replace file 和 preg replace file 如何用下划线替换空格
  • 轨道发动机及装置

    我有一个 Rails 引擎 我想在其中使用 Devise 我像正常一样安装了以下设备本指南 https github com plataformatec devise wiki How To 3a Use devise inside a m
  • “找不到适用于应用程序的有效 aps 环境权利”

    当我将支持推送通知的 iPhone 应用程序的 Ad Hoc 版本加载到我的设备上时 我遇到此错误 找不到适用于应用程序的有效 aps 环境权利 这是什么意思 我该如何修复它 我找到了解决方案 在 构建 gt 代码签名身份 下的项目信息中
  • SQL Server 2005 - 使用前导零格式化十进制数(包括带符号的小数!)

    我需要格式化数字 例如 1 99 21 34 1797 94 300 36 21 99 2 31 使用 SQL Server 2005 T SQL 将格式掩码转换为 0000 00 保留有符号整数和点后的小数 这将用于金融系统的文本文件导出
  • 如何下载 Microsoft.TeamFoundation.Framework.Common.dll

    我正在 Visual Studio 2015 中构建一个应用程序 以允许人们查看 TFS 服务器的变更集 我找到了一些示例代码 但是它需要引用 Microsoft TeamFoundation Framework Common dll 但我
  • 如何将数组/数据表等变量传递给 SQL Server?

    有时 您需要升级数据库 其中数据表中有许多行 或者您有一个充满数据的数组 而不是将所有这些数据放在一个字符串中 然后在 SQL SERVER 中拆分 或者不是在 SQL SERVER 中迭代数据表 逐行代码并更新数据库 还有其他方法吗 SQ
  • 防止按钮在回车键上提交

    我有两个按钮 一个带有 id enterToSubmit 另一个带有 id clickToSubmit 当用户按下回车键时 我希望 enterToSubmit 按钮提交表单 而不是 单击提交 按钮 在同一页面上 我有一个文本框 id tit
  • MySql REGEXP 匹配两个逗号分隔的字符串

    我有一个包含以下值的表 id value 1 1 2 5 8 12 20 2 11 25 26 28 现在我想搜索一些逗号分隔的 ID 例如上述值列中的 1 3 6 7 11 例如 SELECT id FROM tbl name WHERE
  • DecimalFormat 被服务器设置覆盖

    目前我在显示格式化小数时遇到问题 在我的本地计算机中 我有一个十进制值 0 002100000000 存储在数据库中
  • 为什么 libcurl 不为 IP 设置 SNI?

    我刚刚注意到当我使用 IP 进行 HTTPS 调用时 libcurl 没有设置 SNI 字段 我找到了这个 https github com curl curl blame master lib vtls openssl c ifdef S
  • 正则表达式 \p{Punct} 错过了 java 中的 unicode 标点符号

    我写了一个小测试来演示 Test public void missingPunctuationRegex Pattern punct Pattern compile p Punct Matcher m punct matcher asser
  • 如何在断开连接的系统上“repo init”?

    我已经镜像了一个存储库 repo init u
  • FreeBSD 上的“tty”是什么?

    uprintf 函数输出到当前进程的控制tty 这是 Freebsd MAN 中对 uprintf 的描述 我不明白tty是什么 谢谢 假期愉快 A tty是字符 I O 设备的抽象模型 它最直接的是一个系统接口 有相应的应用程序接口 从前
  • 为什么临时对象可以绑定到const引用?

    问题来源 https stackoverflow com a 36955656 4784683 唯一失败的情况是通过非常量引用传递参数 因为临时变量无法绑定到它 void DrawLine const Vector v1 const Vec