auto a = new int[0];
[Basic.compound.3] के अनुसार , संग्रहित मूल्य aनिम्नलिखित में से एक होना चाहिए:
- किसी वस्तु का सूचक (प्रकार का
int)
- एक सूचक एक वस्तु के अंत में पिछले
- शून्य
- अमान्य
हम पहली संभावना से इंकार कर सकते हैं क्योंकि intनिर्मित प्रकार की कोई वस्तु नहीं थी । तीसरी संभावना को खारिज कर दिया जाता है क्योंकि C ++ को वापस करने के लिए एक गैर-शून्य पॉइंटर की आवश्यकता होती है (देखें [basic.stc.dynamic.allocation.2] )। इस प्रकार हम दो संभावनाओं से बचे हैं: एक सूचक एक वस्तु के अंत में या एक अवैध सूचक।
मैं aएक अतीत के सूचक के रूप में देखने के लिए इच्छुक हूं, लेकिन मेरे पास निश्चित रूप से स्थापित करने के लिए एक सम्मानित संदर्भ नहीं है। (हालांकि, [basic.stc] में इसका एक मजबूत निहितार्थ है, यह देखते हुए कि आप deleteइस सूचक को कैसे देख सकते हैं ।) इसलिए मैं इस उत्तर में दोनों संभावनाओं का मनोरंजन करूंगा।
प्रतिलिपि आरंभीकरण और विलोपन के बीच, क्या आपको सूचक को पढ़ने की अनुमति है a + 1?
व्यवहार अपरिभाषित है, जैसा कि [expr.add.4] द्वारा तय किया गया है , चाहे ऊपर से जो भी संभावना लागू हो।
यदि aएक अतीत-अंत सूचक है, तो यह 0बिना तत्वों वाले किसी सरणी के सूचकांक में काल्पनिक तत्व को इंगित करने के लिए माना जाता है । पूर्णांक जोड़ना केवल तभी परिभाषित किया jजाता aहै 0≤0+j≤n, जहां nसरणी का आकार होता है। हमारे मामले में, nशून्य है, इसलिए योग a+jकेवल तब ही परिभाषित किया jजाता है 0। विशेष रूप से, जोड़ना 1अपरिभाषित है।
यदि aअमान्य है, तो हम सफाई से "अन्यथा, व्यवहार अपरिभाषित है।" (आश्चर्य की बात नहीं, जो मामले परिभाषित किए गए हैं वे केवल वैध सूचक मानों को कवर करते हैं।)
इसके अलावा, क्या भाषा कंपाइलर को सेट aकरने की अनुमति देती है nullptr?
नहीं। उपर्युक्त [basic.stc.dynamic.allocation.2] से : "यदि अनुरोध सफल होता है, तो एक बदली आवंटन फ़ंक्शन द्वारा लौटाया गया मान एक अशक्त सूचक मान है" । एक फुटनोट यह भी कहता है कि सी ++ (लेकिन सी नहीं) को शून्य अनुरोध के जवाब में एक गैर-शून्य सूचक की आवश्यकता होती है।
aनिश्चित रूप से पढ़ सकते हैं (आप निश्चित रूप से इसे नहीं कर सकते)।