2010-06-30 8 views
20

शीर्षक मेरे प्रश्न को काफी हद तक बताता है। शून्य सूचक की जांच के लिए निम्नलिखित क्यों नहीं किया जा सकता है?ऑटो_प्टर <T> ऑपरेटर क्यों नहीं है!() परिभाषित किया गया है?

auto_ptr<char> p(some_expression); 
// ... 
if (!p) // error 

यह बजाय किया जाना चाहिए:

if (!p.get()) // OK 

क्यों auto_ptr<T> बस operator!() परिभाषित किया है नहीं करता है?

+0

प्रश्न http://stackoverflow.com/q/2953530/427532 कुछ हद तक संबंधित है। –

उत्तर

19

ऐसा लगता है कि इसके डिजाइन में कोई त्रुटि हुई थी। यह सी ++ 0x में तय किया जाएगा।

वर्ग टेम्पलेट auto_ptr अब मान्य नहीं है: unique_ptr (auto_ptr के लिए प्रतिस्थापन) नई सी ++ स्टैंडर्ड से explicit operator bool() const;

उद्धरण शामिल हैं। [नोट: क्लास टेम्पलेट unique_ptr (20.9.10) बेहतर समाधान प्रदान करता है। अंत टिप्पणी]


कुछ स्पष्टीकरण:
प्रश्न: क्या a.get() == 0 साथ गलत क्या है?
ए:a.get()==0 के साथ कुछ भी गलत नहीं है, लेकिन स्मार्ट पॉइंटर्स आपको वास्तविक पॉइंटर्स के रूप में उनके साथ काम करने देता है। अतिरिक्त operator bool() आपको ऐसा विकल्प देता है। मुझे लगता है कि auto_ptr को हटाने के वास्तविक कारण यह है कि इसमें अंतर्ज्ञानी डिज़ाइन नहीं है। लेकिन नए मानक में unique_ptr के लिए operator bool का अर्थ है कि इसका कोई कारण नहीं है।

+0

"बेवकूफ" प्रश्न: यहां 'स्पष्ट' का अर्थ क्या है? मैंने इसे कभी रचनाकारों के साथ देखा है। –

+3

इसका मतलब है कि रचनाकारों के लिए इसका मतलब यह है कि कन्स्ट्रक्टर या रूपांतरण ऑपरेटर अंतर्निहित रूपांतरण नृत्य में भाग नहीं लेता है जो तब होता है जब आप किसी ऑब्जेक्ट को किसी भिन्न प्रकार के तर्क की अपेक्षा करते हुए किसी ऑब्जेक्ट को पास करने का प्रयास करते हैं –

+0

निश्चित रूप से, 'auto_ptr 'को बहिष्कृत कर दिया गया है, लेकिन यह एक डिजाइन त्रुटि क्यों है कि 'ऑपरेटर'()' नहीं है? 'A.get() == 0' के साथ क्या गलत है? –

8

बस शब्दों में कहें, इसमें operator !() परिभाषित होना चाहिए। auto_ptr एक बहुत अच्छी तरह से डिजाइन कंटेनर नहीं है। बूस्ट में स्मार्ट पॉइंटर्स में operator bool() रूपांतरण ऑपरेटर परिभाषित किया गया है जिसे operator !() से अस्वीकार किया जा सकता है। इससे आपके if(!p) संकलित हो जाएंगे और उम्मीद के अनुसार काम करेंगे।

+9

"' auto_ptr' एक बहुत अच्छी तरह से डिज़ाइन किया गया कंटेनर नहीं है "इसे काफी अच्छी तरह से बताता है। – Cogwheel

+3

'auto_ptr' एक कंटेनर नहीं है। इसके अलावा 'ऑपरेटर!()' परिभाषित क्यों होना चाहिए? यदि आप इसका दावा करने जा रहे हैं, तो मुझे लगता है कि आपको इस दावे को औचित्य देने की आवश्यकता है। मैं इसे परिभाषित करने के लिए कोई अंतर्निहित कारण नहीं देख सकता; ऐसा नहीं है कि 'if (a.get() == 0) 'अस्पष्ट या उपयोग करना मुश्किल है। –

+3

अगर कुछ स्मार्ट पॉइंटर की तरह कार्य करने के लिए डिज़ाइन किया गया है, तो इसके इंटरफेस एक पॉइंटर जैसा दिखना चाहिए। – Cogwheel

0

मुझे संदेह है क्योंकि यह उम्मीद थी कि auto_ptr से शून्य तक गुजरना एक दुर्लभ मामला होगा, अतिरिक्त इंटरफ़ेस जोड़ने से बचने के लिए, और वास्तव में शून्य के लिए जांच करते समय इसे स्पष्ट करने के लिए।

+0

यह देखते हुए कि auto_ptr :: ऑपरेटर = स्वामित्व स्थानांतरित करता है और स्रोत auto_ptr को शून्य पर सेट करता है, auto_ptr को शून्य तक काफी आम हो सकता है। –

4

बूलियन रूपांतरण के साथ कोई समस्या है। यह वाक्यविन्यास की अनुमति देता है जो लगभग हमेशा दर्द होता है।

सौभाग्य से, एक समाधान है: Safe Bool idiom।

bool पर रूपांतरण के साथ समस्या यह है कि निहित रूपांतरण खतरनाक है।

std::auto_ptr<T> p = ..., q = ....; 

if (p < q) // uh ? 

इसलिए, operator bool() const एक abomination है। या तो आप एक स्पष्ट विधि प्रदान करते हैं ... या आप सुरक्षित बूल मुहावरे का उपयोग करते हैं।

मुहावरे का विचार आपको एक प्रकार का उदाहरण देना है जो संचालन के एक बहुत ही कम से कम सबसेट के साथ है और लगभग कोई मामला नहीं है जहां निहित रूपांतरण आपको परेशानी में डाल देगा। यह सदस्य समारोह में सूचक का उपयोग करके किया जाता है।

if (p) और if (!p) जैसे ऑपरेशंस, तो समझ में आता है, लेकिन if (p < q) संकलित करने में विफल हो जाएगा।

पूर्ण समाधान के लिए लिंक को पूरी तरह से पढ़ें, और आपको पता चलेगा कि operator bool() const नहीं होने का अच्छा विचार क्यों था।

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