2012-09-25 14 views
42

संभव डुप्लिकेट:
make_unique and perfect forwardingक्यों सी ++ 11 `make_shared` है लेकिन` make_unique`

है क्यों सी ++ 11 एक make_shared टेम्पलेट है, लेकिन नहीं एक make_unique टेम्पलेट?

यह कोड को बहुत असंगत बनाता है।

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

शायद क्योंकि 'अद्वितीय' को किसी ऑब्जेक्ट को बनाने की आवश्यकता है और उन्होंने सोचा कि यह बेहतर किया गया है –

+2

यह कोड असंगत नहीं है, यह लाइब्रेरी है। –

+1

unique_ptr के लिए कॉपी कन्स्ट्रक्टर निजी है। तो make_unique "वापसी मूल्य अनुकूलन" के बिना काम नहीं करता है। मेरा अनुमान भाषा के अनुसार है यह अनुकूलन अनिवार्य नहीं है। – bop

उत्तर

50

हर्ब Sutter के अनुसार this article में यह "आंशिक रूप से एक निरीक्षण" था। लेख एक अच्छा कार्यान्वयन शामिल है, और यह प्रयोग करने के लिए एक मजबूत मामला बनाता है:

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

अद्यतन: मूल अद्यतन has been updated और जोर बदल गया है।

+2

@hyde धन्यवाद। मैंने इसे अद्यतन किया, लेकिन नए संस्करण में इस उत्तर में नमूना कार्यान्वयन शामिल नहीं है (यह टिप्पणियों में पाया जा सकता है)। – juanchopanza

+7

और 'make_unique' सी ++ 14 में उसी' मेमोरी 'हेडर में भी उपलब्ध होगा http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique – user2485710

+1

N3656, सी ++ 14 में अपनाया गया, एक स्टैंडअलोन कार्यान्वयन है: http://isocpp.org/files/papers/N3656.txt –