2015-03-17 16 views
7

Dựa trên những câu trả lời trong thesequestionshere, tôi biết rằng chắc chắn nó được ưa thích sử dụng C++ 14 của std::make_unique hơn để emplace_back(new X) trực tiếp.push_back hoặc emplace_back với std :: make_unique

Điều đó nói rằng, nó là ưa thích để gọi

my_vector.push_back(std::make_unique<Foo>("constructor", "args")); 

hoặc

my_vector.emplace_back(std::make_unique<Foo>("constructor", "args")); 

Đó là, tôi nên sử dụng push_back hoặc emplace_back khi thêm một std::unique_ptr xây dựng từ std::make_unique?

==== EDIT ====

và tại sao? c: < - (nụ cười nhỏ)

+2

Với đối số thực tế về loại mục của vectơ, 'push_back' và' emplace_back' nhất thiết phải làm như vậy. –

+0

liên quan: http://htmlpreview.github.io/?https://github.com/HowardHinnant/papers/blob/master/insert_vs_emplace.html – dyp

+0

@Praetorian Lỗi chính nhờ. – NHDaly

Trả lời

8

Nó không tạo sự khác biệt, bạn đã có một prvalue unique_ptr<Foo> (kết quả của các cuộc gọi đến make_unique) vì vậy cả hai push_backemplace_back sẽ gọi constructor unique_ptr di chuyển khi xây dựng phần tử được thêm vào vector.

+1

Có đồng ý, đó là lý do tại sao tôi hỏi. :) – NHDaly

0

Rõ ràng

template<class T, class A, class...Args> 
void push_unique(std::vector<std::unique_ptr<T>,A>& v, Args&&...args) { 
    v.push_back(std::make_unique<T>(std::forward<Args>(args)...)); 
} 

là lựa chọn tốt nhất:

push_unique(my_vector,"constructor", "args"); 

buồn bã này là ký hiệu tiền tố: (nhà điều hành, container, lập luận ...) vs infix (arguments điều hành container ...) .

Nếu chỉ có cách để biến nó thành hình ảnh, chẳng hạn như extension methods hoặc named operators.

Vì điều đó sẽ thật tuyệt.

Các vấn đề liên quan