首页 > 解决方案 > std::list 的两个 insert() 方法签名之间的实现差异

问题描述

std::list 的方法 insert() 有 2 个方法签名。一个采用 const 左值引用,如下所示:

iterator insert( const_iterator pos, const T& value );

另一个采用右值引用,如下所示:

iterator insert( const_iterator pos, T&& value );
  1. 但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。

我知道移动右值而不是复制它们可能会更快。

  1. 但是,采用右值引用的第二个方法签名将如何实现value与采用 const 左值引用的第一个不同的移动指令?

右值上的赋值运算符将简单地调用移动构造函数,而在左值上它将调用复制构造函数。所以简单地在第一个函数中使用赋值运算符就足够了,对吧?

谢谢

标签: c++rvalue-reference

解决方案


首先,T&&这里不是通用引用,而是右值引用,因为T不是在函数调用的那一刻推导出来的。目前已知类模板被实例化。

但是我想知道为什么第二个方法签名甚至是必要的?一个 const 左值引用可以绑定到右值。

利用移动语义。采用右值引用启用移动操作。

但是,第二个采用右值引用的方法签名将如何实现对不同于第一个采用 const 左值引用的值的移动指令?

不同之处在于:采用 const 左值引用根本无法移动;只有取右值引用才能移动。


推荐阅读