बदतर करने के लिए सबसे अच्छा के लिए आदेश में:
- someFunction (स्थिरांक टी &);
- कुछ समारोह (टी);
- कुछ फ़ंक्शन (कॉन्स std :: unique_ptr < टी > &);
- कुछ फ़ंक्शन (std :: unique_ptr < टी > &);
पहला सबसे अच्छा है क्योंकि यह ऑब्जेक्ट को संशोधित नहीं करता है और यह ऑब्जेक्ट के साथ काम करेगा चाहे आप इसे आवंटित कैसे करें (उदाहरण के लिए, आप किसी भी समस्या के साथ shared_ptr पर स्विच कर सकते हैं)।
नंबर दो भी स्मार्ट पॉइंटर का उपयोग करने के बावजूद काम करेगा; हालांकि, यह मानता है कि आप ऑब्जेक्ट को संशोधित कर सकते हैं, और जब भी आप कुछ स्थिर बना सकते हैं, तो आपको चाहिए।
संख्या 3 और 4 दोनों ऑब्जेक्ट को प्रतिबिंबित करने की अनुमति देते हैं; हालांकि, # 3 स्मार्ट पॉइंटर को संशोधित करने की अनुमति नहीं देता है, जबकि संख्या 4 करता है। दोनों को नुकसान होता है कि वे unique_ptr के उपयोग को मजबूर करते हैं, जबकि ऊपर दिए गए दो स्मार्ट पॉइंटर क्लास के बावजूद काम करेंगे।
मूल्य के आधार पर एक अद्वितीय_ptr पास करना, जैसा कि आपके कुछ अन्य उदाहरणों में है, एक विकल्प नहीं है; एक अद्वितीय_पीआरआर अद्वितीय होना चाहिए। यदि आप इसे कॉपी कर रहे हैं, तो साझा_ptr का उपयोग करने पर विचार करें।
पहले दो के लिए, यदि आप) पीठ के परिणाम (पर यह लागू है, यह दिखाई देगा:
someFunction(*(lst.back())); // dereference lst.back() before passing it in.
बाद के दो के लिए, यदि आप पीठ के resut पर यह लागू(), यह विचार करेंगे की तरह:
someFunction(lst.back()); // pass the smart pointer, not the object to
// which the smart pointer currently points.
स्रोत
2010-07-11 11:55:11
में गहराई से स्पष्टीकरण के लिए धन्यवाद। तो स्मार्ट पॉइंटर्स के लिए कोई विशेष अर्थशास्त्र आवश्यक नहीं है (dereferencing को छोड़कर)। मुझे 'कॉन्स' सामान के बारे में पता था, लेकिन इस मामले में मुझे पास होने वाली 'टी' ऑब्जेक्ट को संशोधित करने की आवश्यकता है। – rubenvb