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

C++ 为什么push_back有两个左值和右值重载?,c++,c++11,move-semantics,C++,C++11,Move Semantics,为什么一个类/函数有两个重载,一个用于左值,一个用于右值 例如,从视频中,它说我们有两个重载用于vector::push_back void push_back( const T& value ); void push_back( T&& value ); 为什么我们不能有一个超负荷值 void push_back( T value ); 若它是左值,那个么将复制该值;若它是右值,那个么将移动该值。这不是标准的工作方式和保证吗?对于您的by价值主张,从技术上讲,将有复

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

例如,从视频中,它说我们有两个重载用于
vector::push_back

void push_back( const T& value );
void push_back( T&& value );
为什么我们不能有一个超负荷值

void push_back( T value );

若它是左值,那个么将复制该值;若它是右值,那个么将移动该值。这不是标准的工作方式和保证吗?

对于您的by价值主张,从技术上讲,将有复制+移动或移动+移动,而对于其他两个重载,则有单个复制或单个移动。

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

如果容量允许,是否移动分配?只是一个猜测。为什么将
常量类型&
接口更改为
类型
?不应该完全兼容源代码吗?@balki:可能是兼容源代码。ABI兼容?不,我被建议使用值作为参数,并依赖于移动语义,我很惊讶地看到它在STL中没有被遵循。实际上,它们中的一个不会被优化吗?@balki:任何时候,有人告诉你总是选择一种合理的方式而不是另一种,至少在某些时候,它们是错误的。通过了解每种解决方案的成本,并针对每种情况选择最佳解决方案,您可以为客户提供最佳服务。在这种情况下,
vector
的作者不知道
T
的移动构造有多昂贵<如果不使用移动构造函数复制对象,则code>T甚至可能是一个昂贵的操作,在这种情况下,按值方法需要额外的复制构造。此外,每个人都使用
vector
。它必须尽可能快。