2012-09-25 40 views
42

thể trùng lặp:
make_unique and perfect forwardingTại sao C++ 11 có `make_shared` nhưng không 'make_unique`

Tại sao C++ 11 có một mẫu make_shared, nhưng không phải là một make_unique mẫu?

Điều này làm cho mã rất không nhất quán.

auto x = make_shared<string>("abc"); 
auto y = unique_ptr<string>(new string("abc")); 
+1

Có lẽ vì 'duy nhất' cần phải xây dựng một đối tượng và họ nghĩ rằng tốt hơn nên làm rõ ràng –

+2

Nó không phải là mã không phù hợp, đó là thư viện. –

+1

Trình tạo bản sao cho unique_ptr là riêng tư. Vì vậy, make_unique không hoạt động mà không có "tối ưu hóa giá trị trả lại". Tôi đoán là theo spec ngôn ngữ tối ưu hóa này là không bắt buộc. – bop

Trả lời

50

Theo Herb Sutter trong this article, đó là "một phần sự giám sát". bài viết này chứa một thực hiện tốt đẹp, và làm cho một trường hợp mạnh mẽ để sử dụng nó:

template<typename T, typename ...Args> 
std::unique_ptr<T> make_unique(Args&& ...args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

Cập nhật: Bản cập nhật ban đầu has been updated và nhấn mạnh đã thay đổi.

+2

@hyde thanks. Tôi cập nhật nó, nhưng phiên bản mới không có thực hiện mẫu bao gồm trong câu trả lời này (nó có thể được tìm thấy trong các ý kiến). – juanchopanza

+7

và 'make_unique' cũng sẽ có sẵn trong C++ 14 trong cùng một tiêu đề' bộ nhớ' http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – user2485710

+1

N3656, được chấp nhận vào C++ 14, có triển khai độc lập: http://isocpp.org/files/papers/N3656.txt –

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