clang++
कभी भी default initialization of a const variable of class-type without a user-defined constructor की अनुमति नहीं देता है; g++
थोड़ा कम प्रतिबंधक है (नीचे देखें)। this answer के अनुसार, ऐसा इसलिए है क्योंकि पीओडी प्रकार "डिफ़ॉल्ट रूप से प्रारंभ नहीं होते हैं।" अगर मैं सही ढंग से समझता हूं, तो इसका मतलब है कि डिफ़ॉल्ट-प्रारंभिक डिफ़ॉल्ट-कन्स्ट्रक्टर का आह्वान नहीं करता है, न ही यह मूल्य-प्रारंभिकता का आह्वान करता है, इसलिए पीओडी प्रकार के अंदर डेटा सदस्यों को प्रारंभ नहीं किया जाता है। निस्संदेह इसमें कोई प्रारंभिक मान वाले कॉन्स पीओडी प्रकार का कोई अर्थ नहीं है, क्योंकि वे कभी भी प्रारंभ नहीं कर सकते हैं और इसलिए उपयोग करने के लिए सुरक्षित नहीं हैं।डिफ़ॉल्ट और कब डिफ़ॉल्ट रूप से एक कॉन्स वैरिएबल प्रारंभ करें?
इस स्थिति के कुछ वेरिएंट हैं:
- प्रकार तकनीकी रूप से है "पॉड", लेकिन कोई डेटा सदस्य (केवल कार्य करता है) शामिल हैं। (
clang++
एक विशेष मामले के रूप में इस का इलाज नहीं है, और न ही, मुझे लगता है, मानक है, लेकिनg++
यह अनुमति नहीं है, भले ही निर्माताexplicit
चिह्नित है।) - एक खाली निर्माता परिभाषित किया गया है
{}
का उपयोग कर। (यह समस्या का वर्णन करने वालेclang
पृष्ठ पर अनुशंसित कार्यवाही है।) - डिफ़ॉल्ट कन्स्ट्रक्टर
=default
घोषित किया गया है। (सी ++ 11 आगे; प्रकार को अभी भी पीओडी माना जाता है, इसलिए न तो कंपाइलर और न ही मानक इसे एक विशेष मामले के रूप में मानते हैं।) - कुल प्रारंभिक रूप से
{}
का उपयोग करके स्पष्ट रूप से उपयोग किया जाता है, जो (यदि मैं सही ढंग से समझता हूं) मूल्य-प्रारंभिक बन जाता है । (सी ++ 11 आगे;। दोनों compilers और, मुझे लगता है, इस मानक-अनुमति देते हैं)
पहले मामले में, वहाँ कोई अप्रारंभीकृत सदस्य हो सकता है, इसलिए यह स्पष्ट नहीं है क्यों की किसी भी इन्स्टेन्शियशन क्लास को कभी भी "अनियमित" माना जाएगा, भले ही यह const
है या नहीं। चूंकि g++
इस व्यवहार की अनुमति देता है, क्या यह उपयोग करने के लिए सुरक्षित है? यह clang++
और मानक द्वारा क्यों प्रतिबंधित है?
दूसरे और तीसरे मामलों में, का उपयोग कर =default
के बजाय {}
मेरे लिए अजीब लगता है की आवश्यकता (और वहाँ किसी भी अन्य मामलों में जहां g++
की अनुमति देता है पॉड-default-प्रारंभ जहां clang++
नहीं कर रहे हैं?)। संपादित करें:this question अंतर को काफी अच्छी तरह से बताता है, इसलिए मैंने इस भेद के बारे में पूछने वाले प्रश्न का हिस्सा हटा दिया है। (मैं अभी भी लगता है कि यह भाषा का एक बहुत भ्रामक पहलू है, हालांकि।)
अंत में, Foo f{}
हमेशा शून्य प्रारंभ हो जाएगा की {}
, =default
, या परोक्ष-घोषित निर्मित प्रकार यदि Foo::Foo(void)
है सदस्यों?
क्या कोई सदस्य चर के साथ एक कॉन्स पीओडी प्रकार के लिए उपयोग-मामला है? आप गैर-कॉन्स एक का भी उपयोग कर सकते हैं, क्योंकि ऐसे कोई सदस्य नहीं हैं जिन्हें गलती से बदला जा सके। –
@MattMcNabb मुझे यकीन नहीं है। यह एक ऐसा पैटर्न है जो एक सहयोगी के कोड में बार-बार पुनरावृत्ति करता है, टेम्पलेट कारखाने के कार्यों में (या ... ऐसा कुछ)। मैं कल सहयोगी से पूछने के लिए याद रखने की कोशिश करूंगा कि इरादा क्या है। –
'{}' के साथ परिभाषित एक कन्स्ट्रक्टर एक छोटा कन्स्ट्रक्टर नहीं है। – 0x499602D2