2015-06-19 77 views
0

我不太确定我是否可以随时用emplace_back替换push_backEmplace_back而不是push_back对stl容器?

我知道emplace_back可以转发参数直接构造对象的载体而不复制两次(完美转发等)

如果我去做soemthing这样的:

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

然后它应该调用A.正确的复制构造函数? 所以它和push_back完全一样。不是吗?

是否有一些例外? 有没有很好的理由使用push_back?因为那样只是总是使用emplace_back而不考虑它。

+2

什么是你的问题?如果你想利用放置,你会写'o.emplace_back();'。 –

+0

可能重复的[我应该更换所有调用推/ \ back与emplace \ _back?](http://stackoverflow.com/questions/22468837/should-i-replace-all-calls-to-push-back-with -emplace-back) – NathanOliver

+0

在C++ 11之后有'push_back(value_type && val)',所以不需要'emplace_back'临时'A {}'。 – 101010

回答

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从构造函数参数中显式构造一个元素。

+0

来自http://en.cppreference.com/w/cpp/container/vector/emplace_back的'emplace_back'is的另一个重要特征是*通常使用placement-new在就地构建元素的位置容器* –

+0

@RSahu:嗯,是的,这就是* *做的*,但是这并不能回答你为什么要使用它。 –

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