std :: list的方法insert()具有2个方法签名。一个这样的const左值引用:
iterator insert( const_iterator pos, const T& value );
另一个则采用右值引用:
iterator insert( const_iterator pos, T&& value );
我知道,移动右值而不是复制右值可能会更快。
value
上实现与第一个采用const左值引用的移动指令不同的移动指令?rvalues上的赋值运算符将只调用move构造函数,而在lvalues上,它将调用副本构造函数。因此,仅在第一个函数中使用赋值运算符就足够了吗?
谢谢
答案 0 :(得分:2)
首先,这里的T&&
不是通用引用,而是右值引用,因为T
并不是在函数调用时推导出来的。目前,实例化类模板是已知的。
但是我想知道为什么第二种方法签名甚至是必要的? const左值引用可以绑定到右值。
利用移动语义。以右值参考启用移动操作。
但是,第二个采用右值引用的方法签名将如何对不同于第一个采用const左值引用的值执行移动指令?
区别是:引用const左值引用根本不能移动 ;只有采用右值引用才能移动。