为什么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_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 }
做出你所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 &) }