如何使用模板推导类型获得右值和左值引用的不同重载?

2023-12-04

我有一个函数foo通过引用获取参数,我希望它对右值和左值引用有不同的作用。 (我还应该提到foo()尊重常量;它不会改变引用的值。)我知道如果我写:

template <typename T> foo(T&& x);

我已经宣布了转发参考,而不是右值引用,意思是这样:

template <typename T> foo(const T& x);
template <typename T> foo(T&& x);

可能不会给我我想要的东西。

所以,我的问题是:影响两种引用之间不同行为的正确方法是什么?


您可以拥有左值引用重载和转发引用重载:

template <typename T> void foo(T& ) { ... }
template <typename T> void foo(T&& ) { ... }

对于左值,优先考虑第一个重载。对于右值,只有第二个重载是可行的。


如果您想要的是一个 const 左值引用重载和一个非常量右值引用重载,那么您只需向转发引用案例添加一个约束:

template <typename T> void foo(T const& ) { ... }
template <typename T, REQUIRES(!std::is_reference<T>::value)>
void foo(T&& ) { ... }

where REQUIRES是您选择的方法。现在,对于我们的四种情况:

  • 非常量,左值:只有第一个可行
  • const 左值:只有第一个可行
  • 非常量,右值:两者都可行,第二个更匹配
  • const rvalue: both viable, 2nd is more specialized better match
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用模板推导类型获得右值和左值引用的不同重载? 的相关文章

随机推荐

  • jQuery .hover 不工作

    嗨 我的代码有什么问题 当我将鼠标悬停在 open 上时 pull down content 应该从标题向下移动页面 当我离开 open 时 它应该向上移动 但是 当我在页面加载后测试代码时 pull down content 在我将鼠标悬
  • 如果另一个工作表中存在行值,则删除多个工作表中的行值

    下面的代码来自这个答案post关于将行值复制到新工作表 如果它存在于其他工作表中 现在 如果我不想将重复值复制到工作表 3 而是想从工作表 1 和工作表 2 中删除它们 如果工作表 3 中存在 该怎么办 电子表格 我有3张 将在前两张纸上进
  • 锁定和解锁互斥体的效率如何?互斥体的成本是多少?

    在低级语言 C C 或其他语言 中 我可以选择使用一堆互斥体 如 pthread 提供的或本机系统库提供的任何内容 或对象的单个互斥体 锁定互斥体的效率如何 IE 可能有多少条汇编指令以及它们需要多少时间 在互斥体解锁的情况下 互斥体的成本
  • GAS 汇编程序分段错误(写入自动变量)

    我打算在 C 中执行此操作 include
  • 在java中,您可以使用带有必填字段和可重新分配字段的构建器模式吗?

    这与以下问题相关 如何改进构建器模式 我很好奇是否可以实现具有以下属性的构建器 部分或全部参数为必填项 没有方法接收许多参数 即 没有向初始构建器工厂方法提供默认值列表 所有构建器字段都可以重新分配任意次数 编译器应该检查所有参数是否已设置
  • 扩展 MySQLi 类

    我希望能够创建扩展 MySQLi 类的类来执行其所有 SQL 查询 mysql new mysqli localhost root password database or die error connecting to the datab
  • SQL:根据变量选择动态列名

    我有一个 Microsoft SQL 存储过程 我想通过传递给它的变量来设置其列名 CREATE PROCEDURE My Procedure myDynamicColumn varchar 50 AS BEGIN SELECT value
  • 只有背景图像必须在页面加载时淡入

    我有一个带有背景图像 箭头 的 div div 中有一些文本 箭头位于其下方 我希望 div 内的文本随页面一起加载 但背景图像会在几秒钟后加载 这是我的代码 homearrow background url http www stefaa
  • 打字稿重载箭头功能不起作用

    我正在使用严格的空检查 我有以下带有重载类型的箭头函数 type INumberConverter value number number value null null const decimalToPercent INumberConv
  • 像 http://stackoverflow.com/posts/1807421/edit 这样的 URL 是如何在 PHP 中创建的?

    当您在 stackoverflow com 上编辑问题时 您将被重定向到如下 URL https stackoverflow com posts 1807421 edit 但通常情况下应该是 https stackoverflow com
  • 网络摄像头捕获并转换为 avi

    我正在尝试制作一个程序 从网络摄像头捕获视频并从麦克风捕获声音 但我陷入了尝试用静态图像制作电影的部分 我听说你需要使用 directshow 但它对我不起作用 有人知道一段很好的示例代码 可以捕获视频和声音并将其编码到文件 divx 或类
  • 如何使用 data.table 有效计算一个数据集中的 GPS 点与另一数据集中的 GPS 点之间的距离

    我在 R 中面临编码 优化 问题 我有一个包含 GPS 坐标 经度 纬度 时间戳 的长数据集 对于每一行 我需要检查该位置是否靠近公交车站 我有一个包含所有公交车站 荷兰 的 csv 文件 GPS 坐标文件有数百万个条目长 但如有必要可以进
  • 即使有块,Dask 也会出现内存不足的情况

    我正在处理大型 CSV 文件并且我需要制作笛卡尔积 合并操作 我尝试用 Pandas 来解决这个问题 你可以检查 Panda 的代码和数据格式示例对于同样的问题 here 由于内存错误而没有成功 现在 我正在尝试使用 Dask 它应该可以管
  • 如何使用新的 SDK (NodeMCU) 发送多个数据 (conn:send())

    我一直在阅读 NodeMCU 文档和几个有关 SDK 更改的已解决问题 这些 SDK 以前允许发送多个数据流 就像排队的 net socket send 一样 这里似乎引发了一场巨大的争论 730 和那里 993 或者甚至在这里 999 然
  • 使用 botframework 将字节数组显示为图像

    我有一个来自用户上传的图片的字节数组 我需要将此字节数组渲染为图像Skype以及其他渠道使用机器人框架 图像可以以 base64 编码发送 byte imagedata your image var image64 data image j
  • 让 SerializeObject 使用接口内部定义的 JsonProperty“名称”

    当调用 JsonConvert SerializeObject 时 我传入一个实现接口的对象 它是定义 JsonProperty 属性的接口 用于设置所需的 JSON 对象属性名称 但是 当我检查生成的 JSON 对象时 它使用实际的 NE
  • Leaflet R 地图的搜索按钮?

    我在 R 中使用 leaflet 库 它是 leaflet js 库的包装器 我想知道是否可以使用 R 界面 或对底层代码进行一些修改 添加查询或搜索按钮 这里有 javascript 库的搜索插件http leafletjs com pl
  • Subversion 已停止使用雪豹安装

    安装雪豹后 对颠覆的访问已停止工作 有人知道我该如何修复它吗 当我点击我的存储库时 我得到 列出 svn ssh 电子邮件受保护 库 颠覆 存储库 应用程序 错误 210002 网络连接意外关闭说明 空 任何帮助将非常感激 您似乎是通过 S
  • 如何更改 Flutter 日期选择器中的字体?

    如何更改标题和其他文本的字体系列 大小等 Use the Theme小部件来自定义字体 大小和颜色以及许多其他属性showDatePicker 只需添加属性即可builder to showDatePicker并包裹child与Theme
  • 如何使用模板推导类型获得右值和左值引用的不同重载?

    我有一个函数foo通过引用获取参数 我希望它对右值和左值引用有不同的作用 我还应该提到foo 尊重常量 它不会改变引用的值 我知道如果我写 template