2014-09-26 11 views
5

पर रैवल्यू पॉइंटर के लिए निहित कन्स्ट्रक्टर 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 को स्वीकार करने वाले निहित कन्स्ट्रक्टर के लिए कोई भी मौका?

+2

क्यू 3: सी ++ 14 आधिकारिक है, और यह नहीं बदला। – Deduplicator

+0

क्या मुझे कुछ याद आया? Make_shared का उपयोग क्यों नहीं कर रहे हैं? –

+0

@ मार्कोए।वही कारण है कि हम 'std :: string (" literal ") 'हर जगह' का उपयोग नहीं करते हैं, जहां हम 'std :: string' स्वीकार करते हैं जो कार्य करने के लिए शाब्दिक पास करते हैं। यह सादगी है। – GreenScape

उत्तर

8

वहाँ भी एक rvalue देने अपरिष्कृत-सूचक से एक चतुर-सूचक की अंतर्निहित निर्माण की अनुमति नहीं है एक कारण है:

यह सुरक्षित नहीं है।

void foo(std::shared_ptr<T> t); 
char buffer[42]; 
foo(buffer+7); // buffer+7 is a rvalue, and would implicitly convert! 

इस प्रकार, अपने प्रश्न के अन्य दो भागों में:

  1. यह समिति द्वारा एक निरीक्षण नहीं है।

और

  1. यह एक भविष्य सी ++ में दिखाई नहीं देंगे - मानक (वैसे भी, सी ++ 14 बाहर है और यह नहीं दिखाई किया)।
+0

के साथ सुरक्षित हैं, वास्तव में, मैंने इस दिशा में नहीं सोचा था ... – GreenScape

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