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
निश्चित रूप से पढ़ सकते हैं (आप निश्चित रूप से इसे नहीं कर सकते)।