为什么不能重载push_back来完成emplace_back的工作?

Cha*_*l72 45 c++ c++11

首先,我知道这个问题,但我不相信我会问同样的事情.

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

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

template <class... Args>
void push_back(Args&&... args);
Run Code Online (Sandbox Code Playgroud)

这不会破坏向后兼容性,同时允许您传递N个参数,包括将调用正常rvalue或复制构造函数的参数.事实上,GCC C++ 11实现push_back()只需调用emplace_back:

  void push_back(value_type&& __x)
  { 
    emplace_back(std::move(__x)); 
  }
Run Code Online (Sandbox Code Playgroud)

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

我错了吗?有什么理由需要一个全新的功能吗?

Ben*_*ley 42

如果T有一个显式转换构造函数,则emplace_back和之间存在不同的行为push_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
}
Run Code Online (Sandbox Code Playgroud)

做出你所建议的改变意味着push_back在那种情况下这是合法的,我认为这不是理想的行为.我不知道这是不是这个原因,但这是我能想到的唯一一件事.

  • 它在处理`unique_ptr`s的容器时特别有用,因为`v.emplace_back(new foo)`比`v.push_back(std :: unique_ptr <foo>(new foo))`简单得多.但是在这种情况下,应该能够*明确地*请求转换. (7认同)