2012-02-22 9 views
9
std::unique_ptr<int> ptr; 
ptr = new int[3];    // error 
 
error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int *' (or there is no acceptable conversion) 

क्यों इस संकलित नहीं है? मैं मूल सूचक को मौजूदा अद्वितीय_ptr उदाहरण में कैसे संलग्न कर सकता हूं?unique_ptr ऑपरेटर =

उत्तर

27

सबसे पहले, यदि आप एक अद्वितीय सरणी की जरूरत है, यह

std::unique_ptr<int[]> ptr; 
//    ^^^^^ 

यह स्मार्ट सूचक सही ढंग से delete[] उपयोग करने के लिए सूचक पुनःआवंटन देती है, और operator[] को परिभाषित करता है एक सामान्य सरणी नकल करने के लिए बनाते हैं।


फिर, operator= केवल अद्वितीय संकेत के rvalue संदर्भ और कच्चे नहीं संकेत के लिए परिभाषित किया गया है, और एक कच्चे सूचक परोक्ष आकस्मिक काम है कि विशिष्टता टूट जाता है से बचने के लिए एक स्मार्ट सूचक में परिवर्तित नहीं किया जा सकता है। इसलिए एक कच्चा सूचक सीधे इसे सौंपा नहीं जा सकता है। सही दृष्टिकोण निर्माता के लिए रख दिया जाता है:

std::unique_ptr<int[]> ptr (new int[3]); 
//       ^^^^^^^^^^^^ 

या .reset समारोह का उपयोग करें:

ptr.reset(new int[3]); 
// ^^^^^^^  ^

या स्पष्ट रूप से एक अनूठा सूचक के लिए कच्चे सूचक परिवर्तित:

ptr = std::unique_ptr<int[]>(new int[3]); 
// ^^^^^^^^^^^^^^^^^^^^^^^  ^

आप तो C++ 14 का उपयोग कर सकते हैं, new का उपयोग करने पर

0 का उपयोग कर सकते हैं
+2

कारण यह है कि 'ऑपरेटर =' 'int *' * स्वीकार नहीं करता है और * 'int *' लेने वाले कन्स्ट्रक्टर को 'स्पष्ट' चिह्नित किया जाता है (दोनों 'std :: unique_ptr दोनों के लिए 'और' std :: unique_ptr ')। 'ऑपरेटर = 'एक चाल असाइनमेंट ऑपरेटर होने के नाते और एक कॉपी असाइनमेंट ऑपरेटर के पास इसके साथ कुछ लेना देना नहीं है। –

+0

@LucDanton: ठीक है। इसे शामिल करने के लिए अपडेट किया गया। – kennytm

2

से KennyTM

जवाब देने के लिए जोड़ा जा रहा है (के बाद से सी ++ 11)

tr = (decltype(tr)(new int[3])); 

व्यक्तिगत तौर पर मैं इस पसंद के रूप में यह टीआर आसान के प्रकार को अपडेट करने में आता है। (अपडेट करने के लिए केवल एक ही स्थान)