c++ - Need help understanding "{}-initializer syntax minimizes the chances for unfortunate conversions" -


"सी + प्रोग्रामिंग भाषा में" 4 वी संस्करण पृष्ठ 164:

जब हम स्पष्ट रूप से उल्लेख करते हैं जिस वस्तु का हम आरंभ कर रहे हैं, उसके प्रकार पर विचार करने के लिए हमारे पास दो प्रकार हैं: वस्तु का प्रकार और प्रारंभकर्ता का प्रकार उदाहरण के लिए:

  char v1 = 12345; // 12345 एक पूर्णांक int v2 = 'c' है; // 'c' एक चार टी v3 = f () है;  

ऐसी परिभाषाओं के लिए {} -Initializer वाक्यविन्यास का उपयोग करके, हम दुर्भाग्यपूर्ण रूपांतरणों की संभावना को कम करते हैं:

  char v1 {12345}; // त्रुटि: संकुचन int v2 {'c'}; // दंड: पूर्ण चार-> इंट रूपांतरण टी v3 {f ()}; // यदि काम करता है और यदि केवल तभी टाइप किया जा सकता है कि एफ () को किसी भी तरह से टी  

में परिवर्तित किया जा सकता है तो मुझे वाकई समझ नहीं है के लिए संभावना को कम से कम दुर्भाग्यपूर्ण रूपांतरण और टी v3 {f ()}; के लिए टिप्पणी है कि यह काम करता है और केवल तभी जब एफ के प्रकार को पूर्ण रूप से टी । निम्नलिखित दो मामलों पर विचार करें:

  • क) अगर टी में एक स्पष्ट निर्माता का प्रकार एफ () का तर्क लेता है।
  • ख) यदि एफ के प्रकार ) के पास कुछ प्रकार के एक्स और टी के रूपांतरण ऑपरेटर है, जिस प्रकार कंसट्रक्टर एक प्रकार के एक्स के तर्क को लेता है।

    दोनों ही मामलों के लिए, एफ () का प्रकार पूरी तरह से टी , लेकिन T v3 {f ()} अच्छी तरह से बनाई गई है, इसलिए कम से कम तभी उस टिप्पणी का हिस्सा उचित नहीं लगता है? (यह भी सुनिश्चित नहीं है कि यदि भाग सही है या नहीं।)
    और दोनों मामलों के लिए, यह टी v3 = f () है; यह गलत रूप से बन गया है , तो क्या वाक्य दुर्भाग्यपूर्ण रूपांतरणों की संभावना को कम करता है इसका अर्थ यहां है? ऐसा लगता है कि {} - प्रारंभकर्ता वास्तव में अधिक रूपांतरण रूपों को स्वीकार कर रहा है (चाहे यह दुर्भाग्यपूर्ण है या नहीं एक और सवाल है)। (संकीर्णता को रोकना v1 के मामले में सचित्र है और यह स्पष्ट है। मैं v3 के बारे में उलझन में हूं।)

यह वास्तव में डिफ़ॉल्ट रूप से अन्य तरीकों से रूपांतरण करता है।

अपने उदाहरणों में से एक का उपयोग करके, char x = 12345; वास्तव में इस मान को पिछले 8 बिट में कट जाएगा क्योंकि यह चारों के आकार का है {} संकेतन के साथ, यह त्रुटि बढ़ता है क्योंकि यह उपयुक्त नहीं है।

ऐसा कभी कभी (एबी) विशेष प्रभाव पाने के लिए किया जाता था, इसलिए इसे नए सी ++ में डिफ़ॉल्ट विकल्प के रूप में छोड़ा गया , जबकि नई संकेतन का उपयोग त्रुटियों के लिए कम कमरे के साथ बेहतर व्यवहार प्रदान करने के लिए किया जाता है।


Comments