पर रैवल्यू पॉइंटर के लिए निहित कन्स्ट्रक्टर I T *
स्पष्ट स्वीकार करने वाले std::shared_ptr<T>
कन्स्ट्रक्टर बनाने के विचार का बहुत अधिक समर्थन करता है। जब आप ढेर भ्रष्टाचार के कारण को देख रहे हैं, तो यह नींद की रात को बचाने में मदद करता है। स्कॉट मेयर्स ने इसके लिए एक अच्छा स्पष्टीकरण दिया।std :: shared_ptr <T>: टी
लेकिन ... अगर मैं यह एक rvalue
सूचक देने के इस स्पष्ट नहीं है?
/// (1)
std::shared_ptr<T> t = new T;
या
/// (2)
T * giveaway = new T;
std::shared_ptr<T> t = std::move(giveaway);
या वास्तविक जीवन से एक और अधिक दर्दनाक मामला
/// (3)
void foo(std::shared_ptr<T> t);
/// ...
foo(new T);
मेरे लिए, इन सभी मामलों के लिए पर्याप्त स्पष्ट कर रहे हैं: मैं तरह बातें कर सकता है ।
केस (1) prvalue
है, मैं संभवतः दो पॉइंटर्स रखने के लिए खुद को पेंच नहीं कर सकता। कम से कम उपयोग करने से अधिक नहीं:
std::shared_ptr<T> t{new T};
केस (2) काफी स्पष्ट है। यह सहमति है कि कुछ स्थानांतरित करने के बाद उसका मूल्य अपरिभाषित हो जाता है। तो इसका उपयोग पूरी तरह से आप पर है।
केस (3) एक rvalue
फिर से है।
(क्यू 1) यह इस मानक समिति द्वारा एक ओवरलुक है?
(Q2) क्या इसका कोई कारण है?
(Q3) सी ++ 14 में दिखाई देने के लिए rvalue
को स्वीकार करने वाले निहित कन्स्ट्रक्टर के लिए कोई भी मौका?
क्यू 3: सी ++ 14 आधिकारिक है, और यह नहीं बदला। – Deduplicator
क्या मुझे कुछ याद आया? Make_shared का उपयोग क्यों नहीं कर रहे हैं? –
@ मार्कोए।वही कारण है कि हम 'std :: string (" literal ") 'हर जगह' का उपयोग नहीं करते हैं, जहां हम 'std :: string' स्वीकार करते हैं जो कार्य करने के लिए शाब्दिक पास करते हैं। यह सादगी है। – GreenScape