为什么push_back对左值和右值有两个重载?

bal*_*lki 8 c++ move-semantics c++11

为什么类/函数有两个重载,一个用于左值,一个用于右值?

例如,从这个视频中,它说我们有两个重载vector<T>::push_back

void push_back( const T& value );
void push_back( T&& value );
Run Code Online (Sandbox Code Playgroud)

为什么我们不能只按值重载一次,

void push_back( T value );
Run Code Online (Sandbox Code Playgroud)

如果它是左值,则将复制值,如果它是右值,则将移动值.这不是标准的工作方式和保证吗?

use*_*015 8

使用您的按价值命题,技术上会有复制+移动或移动+移动,而其他两个重载则有一个副本或一个移动.

  • @balki:任何时候有人告诉你**总是**选择一种合理的方式而不是另一种,至少在某些时候它们会出错.通过了解每种解决方案的成本并为每种情况选择最佳解决方案,您可以最好地为您的客户服务.在这种情况下,`vector <T>`的作者不知道`T`的移动结构可能有多贵.如果没有移动构造函数,`T`甚至可能是一个昂贵的复制对象,在这种情况下,按值的方法需要额外的复制结构.此外,每个人都使用`vector`.它必须尽可能快. (4认同)

Nic*_*las 5

除了其他人提到的点之外,还需要更改旧界面.而且有时候这是不可接受的.

  • @balki:源兼容,也许吧.ABI兼容吗?*没有.* (2认同)