C++11 . में बदलाव के साथ

परिवर्तन: परिवर्तन: मौजूदा बूलियन रूपांतरण ऑपरेटरों में स्पष्ट उपयोग निर्दिष्ट करें (https://timsong-cpp.github.io/cppwp /n4618/diff.cpp03.input.output)

सी ++ 11 में सी ++ 03 कोड ब्रेक मान्य कर सकते हैं?

struct abt {

        public:

        abt(int a, double b){}

         abt(int a){cout<<"int"<<endl;}

        abt(bool b) {cout<<"bool"<<endl;}

       abt(bool b,bool c) {cout<<"bool bool"<<endl;}

       operator bool() const { return true; } };

     int main() {

    abt is("a",3);
    if (is)
        std::cout << "success";
    if( is == true)
        std::cout << "success";

    return 0;
}

यह वैध सी ++ 03 कोड सी ++ 11 में समान आउटपुट दे रहा है, अंतर्निहित बूलियन रूपांतरण वाला आउटपुट सी ++ 11 में भी समान है। क्या नियम में कुछ गड़बड़ है?

0
a learner 26 जिंदा 2021, 21:04
उस परिवर्तन का मतलब यह नहीं है कि बूलियन रूपांतरण ऑपरेटरों के साथ सब कुछ ने उन्हें स्पष्ट कर दिया है। यह बता रहा है कि मानक पुस्तकालय के विशिष्ट वर्गों ने अपने रूपांतरणों को निहित से स्पष्ट रूप से बदल दिया है। इसलिए यदि आपके पास कोड है जो विशेष रूप से std::istream::sentinel पर निर्भर करता है, तो वह कोड टूट जाता है।
 – 
Nathan Pierson
26 जिंदा 2021, 21:10
धन्यवाद @NathanPierson, बस दोहरी पुष्टि, तो कोड पर कोई प्रभाव नहीं अगर यह c ++ 03 में मान्य था और उपयोगकर्ता परिभाषित चर का उपयोग कर रहा था?
 – 
a learner
26 जिंदा 2021, 21:18

1 उत्तर

सबसे बढ़िया उत्तर

भले ही आपके abt में केवल एक स्पष्ट रूपांतरण होगा if(is) C++11 में ठीक रहेगा, क्योंकि if की स्थिति एक संदर्भ है जहां स्पष्ट रूपांतरण "अंतर्निहित" हैं। cppreference से:

निम्नलिखित संदर्भों में, प्रकार बूल अपेक्षित है और निहित है रूपांतरण किया जाता है यदि घोषणा bool t(e); अच्छी तरह से बनाई गई है (अर्थात, एक स्पष्ट रूपांतरण फ़ंक्शन जैसे explicit T::operator bool() const; पर विचार किया जाता है)। ऐसा व्यंजक e कहा जाता है प्रासंगिक रूप से बूल में परिवर्तित

  • if, while, for की नियंत्रक अभिव्यक्ति;
  • ...

सी ++ 11 में जो बदल गया है वह यह है और मानक प्रकार के बूल में कई अंतर्निहित रूपांतरण स्पष्ट रूपांतरणों में बदल गए हैं। उदाहरण के लिए std::istream::operator bool:

operator void*() const;                 (1)     (until C++11)
explicit operator bool() const;         (2)     (since C++11)

कोड जो हमेशा गलत था, लेकिन पहले संकलित किया गया था, अब संकलित करने में विफल रहेगा, जो कि अच्छा है। उदाहरण के लिए:

#include <iostream>

void foo(bool){}

int main()
{
    foo(std::cout);
}

लाइव डेमो

दूसरी ओर, यदि आपने इस तरह का कोड लिखा है और अंतर्निहित रूपांतरण जानबूझकर किया गया था, तो आपका कोड C++ 11 में टूट जाता है।


टीएल; डॉ:

यह if(is) के लिए एक महत्वपूर्ण बदलाव नहीं है। यदि यह पहले ठीक था तो अब ठीक है (चाहे is आपका कस्टम प्रकार है bool में रूपांतरण के साथ या एक मानक प्रकार, और चाहे जो भी हो, रूपांतरण स्पष्ट है या नहीं)। यदि आप मानक प्रकार के निहित रूपांतरणों पर बहुत अधिक भरोसा करते हैं, तो आपको एक या दो आश्चर्य का सामना करना पड़ सकता है।

2
463035818_is_not_a_number 27 जिंदा 2021, 21:04
क्या हम सभी मानक प्रकार ढूंढ सकते हैं जिसके लिए रूपांतरण निर्माता परिभाषा बदल गई है (यानी स्पष्ट से स्पष्ट तक)
 – 
a learner
27 जिंदा 2021, 04:58
नहीं, मैं आपको पूरी सूची प्रदान नहीं कर सकता और मुझे नहीं पता कि इसे कहां खोजना है। हालांकि मेरे सिर के ऊपर से मुझे उन धाराओं में बूल में रूपांतरण के बारे में पता नहीं है जो स्पष्ट रूप से परिवर्तित नहीं हुई हैं
 – 
463035818_is_not_a_number
27 जिंदा 2021, 11:52