c++ - std::list 的两个 insert() 方法签名之间的实现差异
问题描述
std::list 的方法 insert() 有 2 个方法签名。一个采用 const 左值引用,如下所示:
iterator insert( const_iterator pos, const T& value );
另一个采用右值引用,如下所示:
iterator insert( const_iterator pos, T&& value );
- 但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。
我知道移动右值而不是复制它们可能会更快。
- 但是,采用右值引用的第二个方法签名将如何实现
value
与采用 const 左值引用的第一个不同的移动指令?
右值上的赋值运算符将简单地调用移动构造函数,而在左值上它将调用复制构造函数。所以简单地在第一个函数中使用赋值运算符就足够了,对吧?
谢谢
解决方案
首先,T&&
这里不是通用引用,而是右值引用,因为T
不是在函数调用的那一刻推导出来的。目前已知类模板被实例化。
但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。
利用移动语义。采用右值引用启用移动操作。
但是,第二个采用右值引用的方法签名将如何实现对不同于第一个采用 const 左值引用的值的移动指令?
不同之处在于:采用 const 左值引用根本无法移动;只有取右值引用才能移动。
推荐阅读
- vue.js - 将数据传递给在 v-data-table 内部调用的组件
- java - 如何使用 MappedByteBuffer 读取大文件?
- datatable - 需要帮助选择过滤数据表 1.10 的性别,以匹配准确的男性和女性关键字
- python - 输入类型不支持 seaborn heatmap ufunc 'isnan'
- python - 3D nrrd 图像可视化(matplotlib)?
- aws-lambda - 在 AWS Lamba 上创建实体类
- c# - 不同函数的不同数组值
- c# - Windows 生物识别框架:AcquireFocus() 无法正常工作。错误访问被拒绝:0x80070005
- python - GstBus 没有收到 EOS 事件
- node.js - 为什么heroku在部署时找不到我的节点模块?