2012-02-06 15 views
13

क्या कोई कारण है unique_ptr::reset में ऐसे अधिभार नहीं हैं जो const deleter& और deleter&& अपने रचनाकारों से मेल खाते हैं जो उन्हें दूसरे तर्क के रूप में लेते हैं?क्यों अद्वितीय_ptr :: रीसेट में अधिभार नहीं है जो एक डिलीटर लेता है?

unique_ptr में संग्रहित डिलीटर को कॉपी किया जाएगा या reset से तर्क के साथ असाइन किया जाएगा। यदि डिलीटर noncopyable या nonmovable है, reset के संबंधित अधिभार को संकलित नहीं करेगा। ऐसा लगता है कि यह रचनाकारों के साथ लगातार व्यवहार होगा।

उत्तर

24

मुझे लगता है कि जोड़ने के बारे में सोचा था, लेकिन आप एक कदम असाइनमेंट ऑपरेटर के साथ बराबर कार्यक्षमता प्राप्त कर सकते हैं:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

तो मैं एपीआई यथोचित छोटे रखने के हित में reset साथ एक ही बात नहीं कह का विकल्प चुना।

अद्यतन

और मैं रहते हैं और सीखना ...

वाक्य रचना वास्तव में तुलना में बहुत सरल हो सकता है क्या मैं ऊपर दिखाने:

ptr = {new T(another_value), D(another_state)}; 
+3

+1 एक 'क्यों' प्रश्न का एकमात्र _authoritative_ जवाब रखने के लिए। – ildjarn

+0

अगर रीसेट फ़ंक्शन था तो क्या यह क्लीनर और साझा_ptr के साथ अधिक संगत नहीं होगा? मेरे लिए, जब आपके पास कस्टम डिलीटर फ़ंक्शन होता है तो यह विशेष रूप से क्लीनर महसूस करता है। उदाहरण के लिए: 'ptr = unique_ptr (new_raw_ptr, deleter_function); 'बनाम' ptr.reset (new_raw_ptr, deleter_function);'। या इससे भी बेहतर अगर हम एक ही deleter_function रख सकते हैं, तो यह होगा: 'ptr.reset (new_raw_ptr);'। – felipou

+1

@ फ़ेलिपौ: उत्तरार्द्ध काम करता है।पूर्व के लिए, यहां बताया गया है कि * आप * इसे कैसे कर सकते हैं: http://cplusplus.github.io/LWG/lwg-active.html#submit_issue –

3

क्योंकि निर्माण में ऑब्जेक्ट में डिलीटर संग्रहीत किया जाता है। चूंकि डिलीटर प्रकार टेम्पलेट तर्क है, निर्माण के बाद कक्षा को "दूसरे रूपांतरित करने" का कोई तरीका नहीं है।

+0

तो, प्रति असाइनमेंट ऑपरेटर आह्वान या क्रमशः असाइनमेंट ऑपरेटर ले जाएँ। यदि आपके डिलीटर के पास स्वीकार्य पहुंच योग्य नहीं है तो यह संकलित नहीं होगा। – David

+0

क्या यह एक ऐसा उद्देश्य नहीं है जो एक साधारण उद्देश्य की सेवा करने के लिए एक वर्ग है? –

+0

आप निर्माण की प्रतिलिपि बना सकते हैं और निर्माण को स्थानांतरित कर सकते हैं - असाइन की प्रतिलिपि बनाने और असाइन करने की क्षमता जोड़ने की क्षमता क्यों बढ़ती है? यह मेरे लिए अन्य कार्यक्षमता के साथ एक जटिल जटिलता स्तर की तरह लगता है (जो कहने के लिए, जटिल नहीं है) – David

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