为什么 vector::p ush_back 有两个重载

Why are there two overloads for vector::push_back?

本文关键字:两个 重载 back vector ush 为什么      更新时间:2023-10-16

为什么vector::push_back不接受转发引用而不是有两个重载?我读过,你想要重载左值和右值的唯一原因是如果你的函数为它们做了不同的事情,那么除了移动/复制之外,vector::push_back的两个重载有什么不同?

我这样做很大程度上只是因为情况如何演变。 在C++11之前,只有:

vector<T>::push_back(const T&);

随着右值引用的引入,我建议添加重载:

vector<T>::push_back(T&&);

而不是将原始签名更改为:

template <class U> vector<T>::push_back(U&&);

做出此决定的部分原因是出于对向后兼容性(无论是否保证)的一些担忧,以及为了减轻供应商和委员会其他人的担忧,即这是对功能的简单添加,而不是对现有功能的更改。

如果我今天从头开始重新设计vector,我会认真考虑拥有:

template <class U> vector<T>::push_back(U&&);

或者也许只是:

template <class ...Args> vector<T>::emplace_back(Args&& ...);

您可能想知道的更多详细信息在 N1858.

为什么不按价值push_back

此问题已被标记为重复:

为什么 C++11 std 容器具有按引用传递和按按值传递插入/推送方法?

这就问了这个问题。 所以我认为在这个答案中实际解决这一方面是礼貌的做法......

对于左值和 x值,与按引用解决方案相比,push_back(T)将花费额外的移动构造。 X 值需要 2 个移动构造,左值需要 1 个副本构造和 1 个移动构造。

相比之下,在当前的设计中,左值成本为 1 个副本构造,而 xvalues 成本为 1 个移动构造。

对于某些类型的T,搬家结构并不便宜。 对于vector<T>来说,假设T总是廉价的可移动性,这将是一个糟糕的设计选择。 例如,如果T std::array<double, 100>怎么办? 更改为按值设计将需要 2 个副本构造,而不是 1 到 push_back(prvalue 除外)。

按值解决方案确实有优点,以及应该使用它的时间。 只是vector<T>::push_back()不是那种时代之一。