为什么不 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
按值(value)?
这个问题已被标记为重复:
Why do C++11 std containers have pass-by-ref and pass-by-rvalue insert/push methods?
问这个问题。所以我认为在这个答案中实际解决这个方面是礼貌的做法......
对于左值和 x 值,push_back(T)
与引用解决方案相比,将花费额外的移动构造。 xvalues 需要 2 次移动构造,而左值需要 1 次复制构造和 1 次移动构造。
相比之下,在当前设计中,左值需要 1 次复制构建,而 xvalue 需要 1 次移动构建。
对于某些类型 T
,搬家施工不便宜。对于 vector<T>
来说,这将是一个糟糕的设计选择假设 T
总是便宜地移动。例如,如果 T
是 std::array<double, 100>
?更改为按值设计将需要 2 个复制构造,而不是 1 到 push_back
(纯右值除外)。
按值(value)解决方案确实有优势,并且应该使用它的时间。只是vector<T>::push_back()
不是那些时代之一。
关于c++ - 为什么vector::push_back有两个重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130531/