为什么 vector::p ush_back 有两个重载
Why are there two overloads for vector::push_back?
为什么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()
不是那种时代之一。
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 重载运算符 (<<) cout 在 c ++ 中不起作用,当我互相减去两个矩阵时不起作用
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 使用运算符重载的两个复数的总和
- 为什么我不能用两个参数重载 C++ 运算符 []?
- 两个相同的重载运算符[]一个返回引用
- C++stoi:这两个重载都无法转换所有参数类型
- 重载 == 以递归方式比较两个链表
- 如何在两个不同的类之间重载"=="运算符?
- 为什么 std::p romise::set_value() 有两个重载
- 同一运算符和类的两个重载函数
- 将调用两个重载模板中的哪一个
- 为什么这两个重载函数的声明方式不同
- 为什么 vector::p ush_back 有两个重载
- 如果两个重载函数相似,如何进行更好的设计
- 模板类两个重载函数
- 为什么 std::forward 有两个重载
- 为什么push_back有两个重载左值和右值