unique_ptr<char[]>
को unique_ptr<const char[]>
पर स्थानांतरित करने के लिए सबसे अच्छा मुहावरे क्या है?अद्वितीय_ptr <char[]> से unique_ptr <const char []>
केस का उपयोग करें: मान लीजिए कि आप कुछ बफर में सी स्ट्रिंग बनाते हैं। अपवाद के मामले में उचित सफाई सुनिश्चित करने के लिए, बफर unique_ptr
का उपयोग करके संदर्भ हो सकता है। एक बार स्ट्रिंग का निर्माण हो जाने के बाद, आप स्ट्रिंग के आगे संशोधन से बचने के लिए इसे 0 वर्गघोषित कर सकते हैं, जिसे आप किसी वर्ग के सदस्य को ले जाना चाहते हैं।
यहाँ सबसे अच्छा है मैं अब तक है:
std::unique_ptr<const char[]> res;
std::unique_ptr<char[]> buf(new char[4]);
buf[0] = 'f';
buf[1] = buf[2] = 'o';
buf[3] = '\0';
res = std::unique_ptr<const char[]>(const_cast<const char*>(buf.release()));
आप काम करने के लिए आगे बढ़ नहीं लगता है, शायद अलग Deleter प्रकार की वजह से। यहां तक कि const char
को char
से स्पष्ट कलाकारों को छोड़ते हुए काम नहीं करता है, के रूप में Should `unique_ptr< T const [] >` accept a `T*` constructor argument?
में चर्चा वहाँ प्राप्त करने के लिए क्या मैं ऊपर उल्लिखित किसी भी बेहतर मुहावरा है? मेरा कोड बहुत बेकार दिखता है और अपेक्षाकृत लंबा लगता है कि अवधारणा पहले कितनी सरल लगती है।
सिर्फ 'रेस = std :: चाल (buf) का उपयोग करना;' मेरे लिए ठीक संकलित वीएस -2010 और वीएस2012 और क्लैंग ट्रंक में (libC++ ट्रंक के साथ)। हालांकि, जीसीसी 4.7.2 चोक करता है। – Xeo
ऐसा लगता है कि जीसीसी 4.8 ट्रंक ने समस्या को ठीक किया है और आप वहां 'res = std :: move (buf)' का भी उपयोग कर सकते हैं। अन्यथा, मुझे नहीं लगता कि आप इस कास्ट चीज़ के आसपास हो सकते हैं। आप लाइन को 'res.reset (const_cast (buf.release())) को छोटा कर सकते हैं; हालांकि, '। –
Xeo
@Xeo, जीसीसी 4.8 पर दोनों जानकारी और 'रीसेट' का उपयोग कर छोटे मुहावरे बहुत मूल्यवान हैं। कृपया उन्हें एक उत्तर के रूप में पोस्ट करें। – MvG