2008-11-04 14 views
6

कई बार, बूस्ट लाइब्रेरी के दस्तावेज़ीकरण को देखते हुए, मैंने "convertible to bool" चिह्नित किए गए रिटर्न मानों में भाग लिया है (वाक्यांश के लिए उस पृष्ठ को "कन्वर्टिबल टू बूल" के लिए खोजें, यह लगभग एक तिहाई नीचे है)। मैं एक बार उस कारण के बारे में बताते हुए एक पेपर के एक तिरछे संदर्भ में ठोकर खाई, लेकिन कभी भी पेपर नहीं ढूंढ पाया है (और अब मैं उस पृष्ठ को नहीं ढूंढ सकता जिसे मैंने संदर्भ दिया था)।बूस्ट पुस्तकालयों को बस 'बूल' वापस करने के बजाय "कन्वर्टिबल टू 'बूल' क्यों लौटाते हैं?

क्या कोई यह बता सकता है कि क्यों (और कब) आपको bool लौटने की बजाय "bool में कनवर्ट करने योग्य" वापस करना चाहिए?

उत्तर

25

"बूल के लिए परिवर्तनीय" का अर्थ केवल कुछ भी है जो अर्थपूर्ण रूप से एक बूलियन संदर्भ में उपयोग किया जा सकता है (उदाहरण के लिए if स्थिति में)। यह अंतर्निहित रूपांतरणों में समझ में आता है। एक ऑब्जेक्ट की कल्पना करें जिसे आप बूलियन संदर्भ में उपयोग करना चाहते हैं, उदा। std::fstream:

ifstream ifs("filename"); 
while (ifs >> token) 
    cout "token " << token << " read." << endl; 

यहाँ, ifs बूलियन के लिए परिवर्तनीय है। खैर, वास्तव में, यह नहीं है। इसके बजाय, यह किसी चीज़ के लिए परिवर्तनीय है जो बदले में परिवर्तनीय है bool। इस तरह के बयानों को रोकने के लिए है:

int b = ifs; 

तर्क है कि इस तरह का बयान सबसे शायद इरादा नहीं है और संकलक इसलिए यह को रोकने चाहिए। bool की बजाय "कन्वर्टिबल टू बूल" लौटने से, यह हासिल किया जाता है क्योंकि दो उपयोगकर्ता परिभाषित निहित रूपांतरणों को एक अभिव्यक्ति में जंजीर नहीं किया जा सकता है।

इस संदर्भ में, आप safe bool idiom देख सकते हैं। क्रिस ने रिटर्न प्रकार के रूप में void* का उपयोग करके पहले से ही एक संभावित कार्यान्वयन की ओर इशारा किया है। आमतौर पर, this पॉइंटर का उपयोग true का प्रतिनिधित्व करने के लिए किया जाता है। एसटीएल द्वारा इसका उपयोग किया जाता है। हालांकि, यह दुर्भाग्य से अभी भी त्रुटिपूर्ण है। कई विकल्पों का प्रस्ताव दिया गया है (ऊपर दिए गए आलेख में अच्छी तरह से लपेटा गया है) और जहां तक ​​मुझे पता है, को भी विचार के लिए सी ++ 0x में शामिल किया गया है। हालांकि, मैं इन प्रस्तावों की वर्तमान स्थिति से अवगत नहीं हूं।

+0

यही वह लेख है जिसे मैं ढूंढ नहीं पाया था। धन्यवाद! –

+1

वर्तमान स्थिति स्पष्ट रूपांतरण ऑपरेटर है, जो सुरक्षित बूल मुहावरे को अनिवार्य बनाती है। –

+0

@ सेबेस्टियन, क्या यह? "अगर (एफ)" स्पष्ट ऑपरेटर बूल() को कॉल करेगा या आपको "अगर (बूल (एफ))" की आवश्यकता होगी? ऐसा नहीं है कि मानक पैरामीटर को परिभाषित करता है जैसे कि बूल होने के नाते, केवल बूल में परिवर्तनीय। – jmucchiello

0

शायद प्रदर्शन के लिए? सी/सी ++ में आप संख्याओं पर एक कथन कर सकते हैं (0 झूठा है, और कुछ भी सच है)। सख्त बूल में कनवर्ट करना एक अतिरिक्त ऑपरेशन है, जिसमें कई मामलों में आवश्यकता नहीं होती है।

मैंने वास्तव में बूस्ट का उपयोग नहीं किया है, इसलिए यह सिर्फ एक अनुमान है, लेकिन यह मेरे लिए उचित लगता है।

11

bool एस int एस के लिए प्रचार योग्य हैं और अंकगणितीय परिचालन में भाग ले सकते हैं। अक्सर वांछित परिणाम नहीं होते हैं, जब एक मूल्य का उपयोग सच परीक्षण के लिए किया जाना चाहिए।

एक परिवर्तनीय-हैं- bool आम तौर पर एक void*, जहां नल पॉइंटर गलत है, और कुछ और सच है, और अभी तक अंकगणितीय आपरेशनों के लिए इस्तेमाल नहीं किया जा सकता है की तरह कुछ है।

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