तर्क कटौती को सक्षम करने के लाभ के अलावा (जैसा कि पहले से ही अन्य उत्तरों में उल्लिखित है), कुछ अन्य लाभ भी हैं।
std::make_pair<T1, T2>
पर ध्यान नहीं देता है std::pair<T1, T2>
पर वापस लौटें। यदि आप std::ref
का उपयोग कर मान में गुजरते हैं, तो लौटाई गई जोड़ी std::reference_wrapper
स्टोर नहीं करेगी, यह एक संदर्भ संग्रहीत करेगी।
std::make_shared
आवंटन को जोड़ सकते हैं। shared_ptr
को रीफॉउंट, कमजोर पॉइंटर सूची इत्यादि जैसी चीज़ों को पकड़ने के लिए कुछ जगह चाहिए, जिन्हें सीधे shared_ptr
में संग्रहीत नहीं किया जा सकता है। इन्हें दो अलग-अलग ब्लॉकों की बजाय एक छोटे से बड़े ब्लॉक में बनाए जा रहे ऑब्जेक्ट के साथ जोड़ा जा सकता है।
std::make_shared
और std::make_unique
दोनों यह सुनिश्चित करते हैं कि अपवाद फेंक दिए जाने पर कोई वस्तु पीछे नहीं छोड़ी जाए। यदि आप f(std::shared_ptr<int>(new int), std::shared_ptr<int>(new int))
के रूप में फ़ंक्शन को कॉल करते हैं, तो यह संभव है कि संकलक पहले दो int
ऑब्जेक्ट्स आवंटित करता है, और उसके बाद दो shared_ptr<int>
ऑब्जेक्ट्स बनाता है। यदि दूसरा आवंटन विफल रहता है, और shared_ptr<int>
ऑब्जेक्ट को अभी तक विनाश पर स्मृति जारी करने के लिए सेट अप नहीं किया गया है, तो आपके पास स्मृति रिसाव है। std::make_shared
और std::make_unique
int
के आवंटन और std::shared_ptr<int>
का निर्माण फ़ंक्शन कॉल में और int
के अन्य आवंटन और अन्य फ़ंक्शन कॉल में std::shared_ptr<int>
के अन्य निर्माण को गठबंधन करें। फंक्शन कॉल ओवरलैप नहीं हो सकता है, इसलिए यदि दूसरा आवंटन विफल रहता है, तो पहले से ही एक साझा पॉइंटर है जो पहले आवंटन को पूर्ववत कर देगा, नष्ट हो जाएगा।
नए स्मार्ट पॉइंटर्स के लिए भी बहुत यकीन नहीं है, लेकिन जोड़े के लिए http://stackoverflow.com/questions/9270563/purpose-of-stdmake-pair पर एक नज़र डालें। –
मेरा मानना है कि प्रत्येक के लिए अलग-अलग फायदे हैं, अलग-अलग मौजूदा प्रश्नों में उत्तर दिया गया है। 'make_pair' [लेखक को प्रकार जानने के बिना काम करता है] (http://stackoverflow.com/questions/9270563) शामिल है। 'make_shared' [अपवाद सुरक्षा प्रदान करता है] (http://stackoverflow.com/questions/20895648)। –
यह बेहतर है क्योंकि आप कम टाइप करते हैं? – texasbruce