std :: list的两个insert()方法签名之间的实现差异

时间:2018-07-10 03:32:43

标签: c++ rvalue-reference

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左值引用的移动指令不同的移动指令?

rvalues上的赋值运算符将只调用move构造函数,而在lvalues上,它将调用副本构造函数。因此,仅在第一个函数中使用赋值运算符就足够了吗?

谢谢

1 个答案:

答案 0 :(得分:2)

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

  

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

利用移动语义。以右值参考启用移动操作。

  

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

区别是:引用const左值引用根本不能移动 ;只有采用右值引用才能移动。