为什么push_back不能被重载来执行emplace_back的工作?

首先,我知道这个问题 ,但我不相信我也在问同样的问题。

我知道什么std::vector<T>::emplace_back – 我明白为什么我会用push_back() 。 它使用可变参数模板,允许我将多个参数转发给新元素的构造函数。

但是我不明白的是为什么C ++标准委员会决定需要一个新的成员函数。 为什么他们不能简单地扩展push_back()的function。 据我所见, push_back可能在C ++ 11中被重载为:

 template <class... Args> void push_back(Args&&... args); 

这不会中断向后兼容性,同时允许您传递N个参数,包括将调用正常右值或复制构造函数的参数。 实际上, push_back()的GCC C ++ 11实现只是简单地调用emplace_back:

  void push_back(value_type&& __x) { emplace_back(std::move(__x)); } 

所以,我看到它的方式,不需要emplace_back() 。 所有他们需要添加的push_back()接受可变参数的重载,并将参数转发给元素构造函数。

我错了吗? 有没有什么理由需要一个全新的function呢?

如果T有一个显式的转换构造函数, emplace_backpush_back之间就有不同的行为。

 struct X { int val; X() :val() {} explicit X(int v) :val(v) {} }; int main() { std::vector<X> v; v.push_back(123); // this fails v.emplace_back(123); // this is okay } 

做出你所build议的改变意味着在这种情况下push_back将是合法的,我想这不是所期望的行为。 我不知道是不是这个原因,但是这是我唯一能想出来的。

这是另一个例子。

老实说,两者在语义上是如此不同,他们的类似的行为应该被认为是偶然的巧合 (由于C ++具有特定语法的“复制构造函数”)。

你应该真的使用emplace_back除非你想就地构造语义。
你很less会需要这样的事情。 一般push_back是你真正的,语义上想要的。

 #include <vector> struct X { X(struct Y const &); }; struct Y { Y(int const &); operator X(); }; int main() { std::vector<X> v; v. push_back(Y(123)); // Calls Y::operator X() and Y::Y(int const &) v.emplace_back(Y(123)); // Calls X::X(Y const &) and Y::Y(int const &) }