【发布时间】:2011-10-23 10:57:17
【问题描述】:
首先,我知道this question,但我不相信我在问同样的问题。
我知道 std::vector<T>::emplace_back 的作用 - 我明白为什么我会使用它而不是 push_back()。它使用可变参数模板,允许我将多个参数转发给新元素的构造函数。
但我不明白为什么 C++ 标准委员会决定需要一个新的成员函数。为什么他们不能简单地扩展push_back() 的功能。据我所知,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() 的重载,它接受可变参数,并将参数转发给元素构造函数。
我错了吗?这里需要一个全新的功能有什么原因吗?
【问题讨论】:
-
好问题。 @moka 他知道这两个功能之间的区别。他甚至链接到那个特定的问题。
-
它们有不同的含义,这一切都在你提到的你阅读的问题中得到了解释。比较
v.emplace_back(123)和v.push_back(123)例如vector<SomeType> v;与int的隐式转换。 -
@Gene:好的,我已经对它们进行了比较,我看不出如果将 push_back 简单地修改为 emplace_back 所做的事情会有什么不同。你介意在这里解释一下吗?
-
这是库开发的标准做法。你不改变你的界面,你创造一个新的。然后允许用户按照自己的进度按照新 API 实现旧 API,同时代码永不损坏。