[英]Emplace_back instead of push_back on stl containers?
我不太確定我是否總是可以用emplace_back
替換push_back
。
我知道emplace_back
可以直接在向量中轉發參數以構造對象,而無需復制兩次(完美轉發等)。
如果我做這樣的事情:
vector<A> o;
o.emplace_back(A{});
然后應該調用A的副本構造函數。對嗎? 因此,它與push_back
完全相同。 是不是
有例外嗎? 有充分的理由使用push_back嗎? 因為這樣一來,不考慮它就總是使用emplace_back會更容易。
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
從構造函數參數中顯式構造元素。
另一個應用程序(除了Kerrek SB的答案)是'emplace_back',它在容器中構造了一個不可復制/不可移動的對象:
#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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.