2015-03-27 7 views
9

मैं निम्नलिखित सी ++ 11 कोड है:सी ++ 11 गतिशील ऐरे आंशिक सूची प्रारंभ (बग या गलतफहमी)?

int *ipa = new int[5]{1, 2, 3}; 

मैंने सोचा था कि मैं समझ गया कि तत्वों 3 और 4 (इस मामले में 0) मूल्य प्रारंभ होना चाहिए थे। विजुअल सी ++ 2013 में, यह हो रहा है। मिंगव में 4.8.1 यह नहीं है; वे डिफ़ॉल्ट रूप से प्रारंभ किए जा रहे हैं (यानी, अनियमित)।

मेरा सवाल है, क्या यह ज्ञात संकलक (जीसीसी या मिंगडब्लू) बग है? मैंने व्यर्थ में सभी बग सूचियों (और गुगल) के माध्यम से खोज की है। या, क्या मैंने किसी भी तरह गलत समझा है कि क्या होने वाला है?

+0

[ऐसा लगता है कि यह 4.9 रिलीज श्रृंखला के लिए तय किया गया था] (http://coliru.stacked-crooked.com:

तो, आप सरणी (पूर्णांक या चार ...) की तरह प्रारंभ कर सकते हैं/एक/29db8ce2fee8ed7d)। – Casey

+1

अधिक विशेष रूप से: [4.8.1 में बग है] (http://melpon.org/wandbox/permlink/YaahoDQESVBxFfyp), [4.8.2 नहीं] (http://melpon.org/wandbox/permlink/0mw4m8fhvkRYqsK3) । तो [यह इन बगों में से एक होना चाहिए?] (Https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&list_id=113864&resolution=FIXED&target_milestone=4.8.2)। – Casey

+0

केसी - धन्यवाद। यही वह जानकारी थी जिसकी मुझे आवश्यकता थी। – user1663569

उत्तर

1

सबसे पहले, अगर आपको संदेह है कि कोई बग है, तो इसकी रिपोर्ट करने में कोई हानि नहीं है। यहां GCC bugzilla और उनके bug reporting instructions का लिंक दिया गया है। कम से कम, आपको एक टेस्ट केस और ऑपरेटिंग सिस्टम और अपने कंपाइलर का संस्करण प्रदान करने की आवश्यकता है। इसे पहले एसओ को रिपोर्ट करने के लिए बहुत कम उद्देश्य है, क्योंकि आप all about initialization here पढ़ सकते हैं।


सही व्यवहार है कि शेष तत्वों सी ++ 11 मसौदा मानक का हवाला देते हुए 0 पर प्रारंभ कर रहे हैं:

§5.3.4/15 एक नई अभिव्यक्ति उस प्रकार टी का एक उद्देश्य है कि वस्तु initializes इस प्रकार बनाता है: [...]

  • अन्यथा, नए प्रारंभकर्ता को प्रत्यक्ष-प्रारंभिकरण के लिए 8.5 के प्रारंभिक नियमों के अनुसार व्याख्या किया गया है। [...]

    • अन्यथा, T एक समग्र है अगर, कुल प्रारंभ:

    §8.5.4/3 एक वस्तु या प्रकार T के संदर्भ की सूची-प्रारंभ इस प्रकार परिभाषित किया गया है किया जाता है (8.5.1)।

[...]

  • अन्यथा, यदि प्रारंभकर्ता सूची में कोई तत्व है, वस्तु मूल्य प्रारंभ है।

§8.5.1/7 यदि की तुलना में कम कर रहे हैं सूची में प्रारंभकर्ता-खंड वहाँ कुल में सदस्यों, तो प्रत्येक सदस्य को स्पष्ट रूप से आरंभ नहीं एक खाली प्रारंभकर्ता सूची (से प्रारंभ किया जाएगा रहे हैं 8.5.4)।

§8.5/5 करने के लिए शून्य से प्रारंभ एक वस्तु या प्रकार T के संदर्भ का अर्थ है:

  • अगर T एक अदिश प्रकार (3.9) है, वस्तु मान 0 पर सेट है (शून्य) , एक अभिन्न निरंतर अभिव्यक्ति के रूप में लिया गया, टी में परिवर्तित; [...]

§8.5/7 करने के लिए मूल्य-प्रारंभ प्रकार T की एक वस्तु का अर्थ है: [...]

  • अगर T एक सरणी प्रकार है, तो प्रत्येक तत्व मूल्य आरंभ नहीं हो जाता है ;

  • अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।

1 मैं एक मेटा धागा प्रारंभ सवालों में पूर्व अनुसंधान की कमी को संबोधित करने के Do we need a canonical question about C++ initialization? बुलाया शुरू कर दिया है।

0

संकलक प्रारंभ हो जाएगा 3 और 4 तत्व 0.

ग में

++ 11 इस अभिव्यक्ति का समर्थन किया जा रहा है हो सकता है। int a[10] = {0};

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