2017-04-09 9 views
10

cppreference से: अपने Deleterarray_ptr को array_ptr के सरणी से अब क्यों अनुमति नहीं दी जा रही है?

std::unique_ptr<int[]> arr(new int[1]); 
std::shared_ptr<int> ptr(std::move(arr)); 

shared_ptr के बाद से प्राप्त (एक std::default_delete<T[]>:

सी ++ 11 में और सी ++ 14 यह एक std::shared_ptr<T> एक से std::unique_ptr<T[]> निर्माण करने के लिए मान्य है ऑब्जेक्ट) unique_ptr से, सरणी सही ढंग से डिलीओटेड हो जाएगी।

यह अब C++ 17 में अनुमत नहीं है। इसके बजाय सरणी फॉर्म std::shared_ptr<T[]> का उपयोग किया जाना चाहिए।

सी ++ 17 में इसकी अनुमति क्यों नहीं है? क्या बदल गया?

+0

कुछ रीडिंग अगर आप चाहते हैं: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0414r2.html – Holt

उत्तर

13

p0497r0:

:

गलत से unique_ptr

[...]

कार्यान्वयन अनुभव के आधार पर मेरा मानना ​​है कि सही रूप है shared_ptr निर्माण के लिए बाधा टिप्पणी: यह कन्स्ट्रक्टर बराबर नहीं होगा ओवरलोड रिज़ॉल्यूशन में भाग लें जब तक Y*T* और unique_ptr<Y, D>::pointer के साथ संगत है element_type* में परिवर्तनीय है।

जांच अवांछनीय रूपांतरण unique_ptr<T[]> से shared_ptr<T> को रोकता है और "के साथ संगत" "परिवर्तनीय करने के लिए" चेक सुनिश्चित करता है कि unique_ptr<Y, D>::get() का परिणाम shared_ptr में संग्रहित किया जा सकता है और shared_ptr<T>::get() से लौट आए।

दूसरे शब्दों में, यह जानबूझकर अमान्य बना दिया गया था क्योंकि यह वैध नहीं होना चाहिए, न केवल अन्य परिवर्तनों का दुष्प्रभाव।

जो मुझे समझ में आता है। shared_ptr<T> अन्य प्रोग्रामर द्वारा पढ़ा जाने की संभावना है जैसा कि केवल एक T ऑब्जेक्ट को इंगित करता है। shared_ptr<T[]> का उपयोग करने के लिए प्रोग्रामर की आवश्यकता होती है जब वे एकाधिक T ऑब्जेक्ट्स को अधिक पठनीय कोड की ओर ले जाते हैं।

नोट: यह सही रूप मानक में नहीं है। तर्कसंगत, हालांकि, मानक में क्या है इस पर एक टिप्पणी है।

+0

मुझे लगता है कि यह उचित है कि ' unique_ptr' नहीं करना चाहिए 'shared_ptr ' में परिवर्तित किया जाए। लेकिन क्या यह पीछे की संगतता को तोड़ने लायक है? – ikh

+3

@ikh ध्यान रखें कि मूल रूप से, * नहीं * चेक थे, इसका मतलब यह था कि जेनेरिक कोड एसएफआईएनएई का उपयोग नहीं कर सकता है ताकि यह स्पष्ट रूप से परिवर्तित हो सके कि 'std :: unique_ptr ' to std :: shared_ptr 'बकवास है । ('static_assert (std :: is_convertible , std :: shared_ptr >()," "); 'पास करने की आवश्यकता थी।) यदि शब्द को सही करने के लिए समायोजित किया गया है, तो, मुझे लगता है कि यह तुरंत इसे प्राप्त करने लायक है। – hvd

+0

@ikh भी साझा पीआरटी एलियासिंग कन्स्ट्रक्टर एक वर्कअराउंड है यदि हमें उस विशेष रूपांतरण की आवश्यकता है। 'ऑटो tmp = shared_ptr (std :: move (up)) की तरह; ऑटो एसपी = shared_ptr (tmp.get(), tmp); ' – Yakk

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