std::list 的两个 insert() 方法签名之间的实现差异
Difference in implementation between two insert() method signatures for std::list
std::list 的方法 insert() 有 2 个方法签名。一个采用常量左值引用如下:
iterator insert( const_iterator pos, const T& value );
另一个采用右值引用,如下所示:
iterator insert( const_iterator pos, T&& value );
- 但是我想知道为什么还需要第二种方法签名?常量左值引用可以绑定到右值。
我知道移动右值而不是复制它们可能会更快。
- 但是,采用右值引用的
- 第二个方法签名如何在
value
上实现与第一个采用常量左值引用不同的移动指令?
右值上的赋值运算符将只调用移动构造函数,而在左值上,它将调用复制构造函数。因此,只需在第一个函数中使用赋值运算符就足够了,对吗?
谢谢
首先,这里的T&&
不是通用引用,而是右值引用,因为在函数调用时不会推导T
。在实例化类模板的那一刻是已知的。
但是我想知道为什么还需要第二种方法签名?常量左值引用可以绑定到右值。
利用移动语义。获取右值引用启用移动操作。
但是,采用右值引用的第二个方法签名将如何实现与第一个采用常量左值引用不同的值的移动指令?
区别在于:获取常量左值引用根本无法移动;只有获取右值引用才能移动。
相关文章:
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- std::list 的两个 insert() 方法签名之间的实现差异
- C++实现相同接口的对象/类之间的数据共享
- 接口实现和私有继承之间的交互
- 比较器的两个实现之间的差异
- C++:调用运算符和调用其实现之间有区别吗
- C++ 和 Python 实现之间的不同伪随机数
- 有没有办法根据模板参数的类型在不同的类实现之间进行选择
- 可能的std ::前向实现之间的区别
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- Arduino上的串行和流之间有什么区别,以及如何实现序列
- 如何在 2 个应用程序之间实现拖放?
- 原子衰落实现之间的差异
- openssl rc4 命令行加密和 cpp 文件实现 rc4 之间的区别
- UWP:在两个页面之间实现基本导航会导致错误
- STD ::正向实现之间的区别
- 库如何在不同的操作系统之间实现可移植性
- C++11:根据项目计数在 std::array 和 std::unordered_map 之间实现选择器
- 我能否在 uint_fast64_t 和无符号长整型之间实现类型等效性
- Qt-关于如何在UI窗体之间实现导航的任何指南