c++ - 为什么vector::push_back有两个重载?

标签 c++ c++11

为什么不 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总是便宜地移动。例如,如果 Tstd::array<double, 100> ?更改为按值设计将需要 2 个复制构造,而不是 1 到 push_back (纯右值除外)。

按值(value)解决方案确实有优势,并且应该使用它的时间。只是vector<T>::push_back()不是那些时代之一。

关于c++ - 为什么vector::push_back有两个重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130531/

相关文章:

c++ - CLion 无法解析类型 std::unordered_map,即使它提示我包含 header 并且编译工作正常

c++ - 如何制作包含唯一指针的类的标准列表

c++ - 输出窗口显示抛出的异常

c++ - 为 ffmpeg 编码设置 RGB 帧的单个像素

c++ - 这是对 std::bind 的错误使用还是编译器错误?

c++ - 模板类特化 - 如何将模板参数传递给构造函数?

c++ - 如何在命名 union 中使用构造函数?以及以后如何更改同一 union 实例中的值? C++/C++11

c++ - 快速计算数组中零值字节的数量

c++ - 为什么我们在内存中限制堆栈的大小而不是堆的大小

c++ - Kinect SDK 2.0 处理和获取深度帧