2013-06-03 6 views
5

बूस्ट unique_ptr को बढ़ावा देने के दौरान और link पर यह कहता है कि इस तरह के पॉइंटर की प्रतिलिपि नहीं बनाई जा सकती है जिसे मैं समझता हूं हालांकि यह कहता है कि इस तरह के पॉइंटर को फ़ंक्शन से वापस किया जा सकता है। यह मेरे दिमाग में एक प्रश्न उठाता है जब किसी फ़ंक्शन से कुछ वापस नहीं किया जाता है (एक संदर्भ या सूचक के रूप में नहीं) प्रतिलिपि निर्माता कहा जाता है। तो क्या इसका मतलब यह है कि अद्वितीय पीआरटी असाइनमेंट ऑपरेटर के साथ काम नहीं करता है और एक प्रतिलिपि निर्माता के साथ काम करता है (जैसे कि एक समय में केवल एक ऑब्जेक्ट के लिए पीआरआर अंक) क्या साझा_प्टर को बढ़ावा देने के अलावा इसमें ओवरहेड कम होता है? मैं VS2010एक अद्वितीय_ptr <T> लौट रहा है। अवधारणा स्पष्टीकरण

+1

"हालांकि, new move semptics का उपयोग करके unique_ptr को स्थानांतरित किया जा सकता है"। आपको आम तौर पर रावल संदर्भों को देखना चाहिए और विशेष रूप से अर्थशास्त्र को स्थानांतरित करना चाहिए। – Dave

+0

संभावित डुप्लिकेट [कार्यों से अद्वितीय \ _ptr लौटने] [http://stackoverflow.com/questions/4316727/returning-unique-ptr-from-functions) – Praetorian

उत्तर

13

जब फ़ंक्शन से कुछ वापस लौटाया जाता है (संदर्भ या सूचक के रूप में नहीं) प्रतिलिपि निर्माता को बुलाया जाता है। [...]

आवश्यक नहीं है। सी ++ 11 में, कॉपी कन्स्ट्रक्टर केवल तभी चुना जाता है जब चालक स्थानांतरित नहीं होता है। एक चालक कन्स्ट्रक्टर की अनुपस्थिति में, सामान्य रूप से एक चाल (उदाहरण के लिए किसी फ़ंक्शन से मूल्य पर लौटने पर) एक प्रतिलिपि के लिए तय होता है।

unique_ptr में एक चालक कन्स्ट्रक्टर है, जिसका अर्थ है कि unique_ptr किसी फ़ंक्शन से मूल्य द्वारा वापस किया जा सकता है।

क्या यह साझा_प्टर को बढ़ावा देने के बजाय ओवरहेड से भी कम है?

यह एक असंबंधित प्रश्न है, लेकिन हाँ, इसमें कम ओवरहेड है। वास्तव में, unique_ptr को शून्य-ओवरहेड कच्चे सूचक के RAII wrapper के रूप में डिज़ाइन किया गया है जो अद्वितीय स्वामित्व को समझता है। unique_ptr का उपयोग करके कच्चे सूचक के उपयोग के संबंध में प्रदर्शन के संदर्भ में और स्मृति खपत के मामले में कोई हानि नहीं होती है।

+0

सी ++ 0x – MistyD

+0

में क्या दूसरा भाग सही है। क्या आप सी ++ 0x – MistyD

+0

@ मिस्टीडी के संदर्भ में पहले भाग को समझा सकते हैं: कोई "सी ++ 0x" नहीं है। सी ++ 0 एक्स नाम सी ++ 11 था, इससे पहले कि यह ज्ञात हो गया था कि मानक को 2011 –

संबंधित मुद्दे