在stl容器上使用Emplace_back而不是push_back?

时间:2015-06-19 16:13:48

标签: c++ stl

我不太确定我是否总能用push_back替换emplace_back

我知道emplace_back可以转发参数直接在向量中构造对象而无需复制两次(完美转发等...)

如果我像这样做:

vector<A> o;
o.emplace_back(A{});

那么它应该调用A的拷贝构造函数。正确吗? 所以它与push_back完全相同。不是吗?

有一些例外吗? 有没有充分的理由使用push_back?因为在不考虑它的情况下使用always emplace_back会更容易。

2 个答案:

答案 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);
}