C++ std::vector::push_back(T&&value)是如何实现的?

C++ std::vector::push_back(T&&value)是如何实现的?,c++,visual-studio,c++11,vector,move,C++,Visual Studio,C++11,Vector,Move,这个push_-back重载是如何实现的 void push_back( T&& value ); 或者一种可能的实现方式?一种可能的实现方式: template <typename T, typename Allocator> void vector<T, Allocator>::push_back(T&& _element) { if (size() == capacity()) reallocate(capacity()

这个push_-back重载是如何实现的

void push_back( T&& value );

或者一种可能的实现方式?

一种可能的实现方式:

template <typename T, typename Allocator>
void
vector<T, Allocator>::push_back(T&& _element) 
{
    if (size() == capacity()) reallocate(capacity() * 2);

    construct(data()[size()], std::move(_element));
    ++size_val;

    update_vector();
}
构造将调用T::TT&&如果有。否则它将调用T::Tconst T&


有关更多信息,请参见和搜索构造

一个非常简单的实现是:

template <typename T, typename Allocator>
void vector<T, Allocator>::push_back(T&& _element)
{
  emplace_back(std::move(_element));
}
如果值类型T有一个move构造函数,即T::TT&&,那么这样做比使用其复制构造函数更有效。一个std::vector确实要求它的值类型是可复制构造的,因此如果没有move构造函数,它将使用copy构造函数


一种常见的情况是,当一个类包含一个指向大缓冲区或结构的指针时,这会产生影响。如果我们需要一个初始化为可以修改的相同数据的副本,并且原始副本必须保持有效,那么我们必须制作一个昂贵的深度副本。另一方面,当我们知道源是一个将被丢弃的临时对象时,我们可以将其内容与空对象的内容交换。这让我们可以重复使用相同的内存,而无需重新分配或深度复制其内容。

只需查看计算机上的库标题,我看不出在此处粘贴一些实现有什么好处。一种方法:data[last_element+1]=std::movevalue@杰里科芬:不,价值本身就是左值。您需要std::move使值成为右值引用。@JerryCoffin右值引用不是右值。@JerryCoffin否,它被转换为右值;value是一个左值,作为命名变量。