क्या C-11 में सुरक्षित-बूल मुहावरा अप्रचलित है?


179

@R का यह उत्तर। मार्टिनो फर्नांडीस से पता चलता है, कि सेफ-बूल मुहावरा C ++ 11 में स्पष्ट रूप से पदावनत है, क्योंकि इसे एक साधारण से बदला जा सकता है

explicit operator bool() const;

उत्तर में मानक बोली के अनुसार §4 [conv] p3:

एक अभिव्यक्ति ई स्पष्ट रूप से एक प्रकार में परिवर्तित किया जा सकता है Tअगर और केवल अगर घोषणा T t=e;अच्छी तरह से बनाई गई है, कुछ आविष्कार अस्थायी चर t(impl8.5) के लिए। कुछ भाषा निर्माणों को एक अभिव्यक्ति को बूलियन मान में बदलने की आवश्यकता होती है। eइस तरह के संदर्भ में प्रकट होने वाली अभिव्यक्ति को प्रासंगिक रूप से परिवर्तित किया जाता है boolऔर इसे अच्छी तरह से बनाया जाता है, यदि केवल और केवल घोषणा bool t(e);ही अच्छी तरह से बनती है , तो कुछ आविष्कृत अस्थायी चर टी (.58.5) के लिए।

हाइलाइट किया गया भाग स्पष्ट रूप से "निहित स्पष्ट कास्ट" (मानक में "प्रासंगिक रूपांतरण" कहा जाता है) @ आर के रूप में दिखाता है। मार्टिनो ने डाला।

"निश्चित भाषा निर्माण" के लिए आवश्यक है कि "निहित स्पष्ट कलाकार" निम्नलिखित प्रतीत हों:

  • if, while, for( §6.4 [stmt.select] p4)
  • बाइनरी लॉजिकल ऑपरेटर्स &&और ||( §5.14 [expr.log.and/or] p1दोनों के लिए)
  • तार्किक निषेध ऑपरेटर !( §5.3.1 [expr.unary.op] p9)
  • सशर्त ऑपरेटर ?:( §5.14 [expr.cond] p1)
  • static_assert( §7 [dcl.dcl] p4)
  • noexcept( §15.4 [except.spec] p2)

क्या शीर्षक में हमारी धारणा सही है? मुझे उम्मीद है कि हमने किसी भी संभावित कमियों को नजरअंदाज नहीं किया।


30
+1: मुझे इस प्रकार का प्रश्न बहुत पसंद है जो मुझे आगामी मानक के बारे में नई बातें सिखाता है।
ब्योर्न पोलेक्स

1
आपको पता है कि मानक में निहित स्पष्ट कास्ट क्या है ... दूसरे से कुछ वापस करना operator bool। उदाहरण के लिए, अगर मेरे पास एक shared_ptrसदस्य है जिसे पी कहा जाता है और यह विधि है: operator bool() const { return p; }यह संकलन करने में विफल रहता है। वह मूर्ख IMO है।
डेविड

"अंतर्निहित स्पष्ट" कास्ट, @ डेविड से आपका क्या मतलब है?
एस.जे.

जवाबों:


128

हाँ। यह केवल अनुमानित उपयोगकर्ता-परिभाषित रूपांतरण होने के साथ समस्याओं का उदाहरण है और स्पष्ट उपयोगकर्ता-परिभाषित रूपांतरण ऑपरेटरों को व्यावहारिक रूप से इस समस्या के कारण आविष्कार किया गया था और सभी सुरक्षित-बूल सामान को बहुत अधिक क्लीनर और अधिक तार्किक के साथ बदलने के लिए।


-5

मैं इसे "अप्रचलित" नहीं कहूंगा। हर कोई अभी तक C ++ 11 ( 1 साल पुराना भी नहीं ) के लिए छलांग ले रहा है। और यहां तक ​​कि अगर एक अच्छी मात्रा में कोडर थे, तो कोड को पीछे की ओर रखने की क्षमता एक संगत होगी, इस तरह के मुहावरों पर विचार करना पुस्तकालयों के लिए उचित कार्यक्रमों की तुलना में अधिक समझदार लगता है।


34
मैं शुद्ध रूप से C ++ 11 की उपस्थिति में बात कर रहा था। यह प्रश्न न तो पुराने कोड, पीछे की ओर संगतता, या अनिच्छा को सी ++ 11 जागरूक संकलक में बदलने के लिए छूता है। यह भी ध्यान दें कि अपने आप में C ++ 11 पूरी तरह से पीछे की ओर प्रशंसनीय नहीं है, इसने ब्रेकिंग परिवर्तन पेश किए।
Xio

4
माफ करना, यह जानने में सक्षम नहीं होगा। मैंने शुरुआत में केवल उत्तर से जुड़े पर विचार नहीं किया, बल्कि यह भी कि प्रश्न [c ++] और [c ++ - faq] को टैग किया गया है, जिसने मुझे यह सोचने के लिए प्रेरित किया कि भाषा के दोनों चरणों का मूल्यांकन प्रासंगिक था।
लुइस माचूका

1
आप निश्चित रूप से सही हैं, हालांकि, मैंने इसे स्पष्ट रूप से प्रश्न में नहीं बताया है। मुझे लगता है कि सिर के लिए धन्यवाद में संपादित करेंगे।
Xeo

1
यह उत्तर वास्तव में अद्यतन करने का उपयोग कर सकता है, अब जब यह लगभग दो साल पुराना है।
पपी

1
मैं असहमति के कारण नीचा दिखाने वाला हूं, हालांकि मैं आपको व्यक्ति में एक बीयर खरीदूंगा और कहूंगा कि "कोई कठिन भावनाएं नहीं हैं"। लेकिन C ++ 11 में कई प्रतिमान तैनाती का अनुभव कर रहे थे जब --std=c++0xतक कि अंतिम कील मानकों के ताबूत में डाल दिया गया था और उन्होंने आईएसओ कल्पना पर नाम डालने का फैसला किया। जब तक आप एक बहुत ही गहरे टेम्पलेट मेटाप्रोग्रामिंग जंकी नहीं होते, तब तक C ++ 11 युक्ति बनाम जो लोग उपयोग कर रहे थे, उसका विवरण आपके लिए कोई परिणाम नहीं होने की संभावना है ... जिसका अर्थ है कि यह 2011 से लगभग सभी व्यावहारिक उद्देश्यों के लिए पुराना था। और अब, मेरी घड़ी से, यह लगभग 2015 है
HostileFork का कहना है कि SE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.