C ++ 11 के बाद से आपको इसे कॉन्स्ट मूल्य पर लेना चाहिए और जितना आप सोच सकते हैं, उससे अधिक बार।
यदि आप std :: share_ptr (अंतर्निहित प्रकार T के बजाय) ले रहे हैं, तो आप ऐसा इसलिए कर रहे हैं क्योंकि आप इसके साथ कुछ करना चाहते हैं।
यदि आप इसे कहीं और कॉपी करना चाहते हैं , तो इसे कॉपी करके लेने के लिए अधिक समझ में आता है, और std :: इसे आंतरिक रूप से स्थानांतरित करें, बजाय इसे कॉन्स्टेंस द्वारा लेने के बाद और फिर बाद में इसे कॉपी करके। ऐसा इसलिए है क्योंकि आप कॉल करने वाले को std में विकल्प की अनुमति देते हैं :: अपने फ़ंक्शन को कॉल करते समय शेयर्ड_प्ट्र को स्थानांतरित करें, इस प्रकार अपने आप को वेतन वृद्धि और वेतन वृद्धि कार्यों का एक सेट बचा सकता है। या नहीं। यही है, फ़ंक्शन का कॉलर यह तय कर सकता है कि फ़ंक्शन को कॉल करने के बाद उसे std :: share_ptr की आवश्यकता है या नहीं, और इस बात पर निर्भर करता है कि वह स्थानांतरित होता है या नहीं। यदि आप कब्ज से गुजरते हैं तो यह प्राप्त करने योग्य नहीं है, और इस प्रकार यह मूल्य के हिसाब से लेना है।
बेशक, अगर फोन करने वाले को दोनों के लिए अपने शेयर्ड_पार्ट की आवश्यकता लंबे समय तक रहती है (इस प्रकार std :: इसे स्थानांतरित नहीं कर सकते हैं) और आप फ़ंक्शन में एक सादा कॉपी नहीं बनाना चाहते (कहते हैं कि आप एक कमजोर सूचक चाहते हैं, या आप केवल कभी-कभी चाहते हैं इसे कॉपी करने के लिए, कुछ शर्त के आधार पर), फिर एक कास्ट और अभी भी बेहतर हो सकता है।
उदाहरण के लिए, आपको करना चाहिए
void enqueue(std::shared<T> t) m_internal_queue.enqueue(std::move(t));
ऊपर
void enqueue(std::shared<T> const& t) m_internal_queue.enqueue(t);
क्योंकि इस मामले में आप हमेशा आंतरिक रूप से एक प्रतिलिपि बनाते हैं
shared_ptr
, और यदि मैं चाहता हूं तो मैं इसे बदल सकता हूं।", जबकि मूल्य संस्करण कहता है "मैं आपकी प्रतिलिपि बनाने जा रहा हूंshared_ptr
, इसलिए जब मैं इसे बदल सकता हूं तो आप कभी नहीं जान पाएंगे।" ) एक कॉन्स्ट-रेफ़रेंस पैरामीटर वास्तविक समाधान है, जो कहता है "मैं कुछ उर्फ जा रहा हूंshared_ptr
, और मैं इसे बदलने का वादा नहीं करता हूं।" (जो कि