std::list 的两个 insert() 方法签名之间的实现差异
Difference in implementation between two insert() method signatures for std::list
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
在函数调用的时候并没有被推导。目前已知 class 模板被实例化。
However I was wondering why the second method signature was even necessary? A const lvalue reference can bind to rvalues.
利用移动语义。采用右值引用启用移动操作。
However, how will the second method signature that takes a rvalue reference implement a move instruction on value that differs from the first that takes a const lvalue reference?
区别是:取const左值引用根本不能移动;只有取右值引用才能移动
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
在函数调用的时候并没有被推导。目前已知 class 模板被实例化。
However I was wondering why the second method signature was even necessary? A const lvalue reference can bind to rvalues.
利用移动语义。采用右值引用启用移动操作。
However, how will the second method signature that takes a rvalue reference implement a move instruction on value that differs from the first that takes a const lvalue reference?
区别是:取const左值引用根本不能移动;只有取右值引用才能移动