我不太确定我是否总能用push_back
替换emplace_back
。
我知道emplace_back
可以转发参数直接在向量中构造对象而无需复制两次(完美转发等...)
如果我像这样做:
vector<A> o;
o.emplace_back(A{});
那么它应该调用A的拷贝构造函数。正确吗?
所以它与push_back
完全相同。不是吗?
有一些例外吗? 有没有充分的理由使用push_back?因为在不考虑它的情况下使用always emplace_back会更容易。
答案 0 :(得分:3)
emplace
的主要目的是执行显式转换:
#include <chrono>
#include <vector>
using namespace std::chrono_literals;
std::vector<std::chrono::seconds> time;
time.push_back(1s); // OK
// time.push_back(1); // Error, thank god
time.emplace_back(1); // OK, we assume you know what you're doing
使用push_back
将给定值的元素添加到容器中。使用emplace_back
从构造函数参数中显式构造元素。
答案 1 :(得分:2)
'emplace_back'的另一个应用程序(除了Kerrek SB的答案之外)是在容器中构建一个不可复制/不可移动的对象:
#include <list>
class Resource
{
private:
int id;
int data;
public:
Resource(int id, int data) : id(id), data(data) {}
Resource(const Resource&) = delete;
Resource& operator = (const Resource&) = delete;
};
int main() {
std::list<Resource> resources;
// The following will not compile:
// resources.push_back(Resource(1, 2));
resources.emplace_back(1, 2);
}