मैं यहाँ के बाद से जवाब देने यदि परिणाम अंक सरणी वस्तु के अंतिम तत्व के बाद एक, यह एक एकल * ऑपरेटर कि मूल्यांकन किया जाता है की संकार्य के रूप में इस्तेमाल नहीं किया जाएगा ... अन्य उत्तर अब पुराने हैं; फिर भी, वे सवाल का सही नहीं थे।
सबसे पहले, सी ++ 14 ने प्रश्न में उल्लिखित नियमों को बदल दिया है। एक अमान्य सूचक मूल्य के माध्यम से संकेत या एक डेलोकेशन फ़ंक्शन के लिए अमान्य सूचक मान को पास करना अभी भी अनिर्धारित है, लेकिन अन्य परिचालन अब लागू नहीं हैं, Documentation of "invalid pointer value" conversion in C++ implementations देखें।
दूसरा, शब्द गिना जाता है। नियमों को लागू करते समय आप परिभाषाओं को बाईपास नहीं कर सकते हैं। यहां मुख्य बिंदु "अमान्य" की परिभाषा है। Iterators के लिए, यह [iterator.requirements] में परिभाषित किया गया है। वास्तव में, यह भी सच है कि pointers are iterators, उनके लिए "अमान्य" का अर्थ काफी अलग है। पॉइंटर्स के नियम "अमान्य" को "अमान्य मान के माध्यम से अप्रत्यक्ष नहीं करते" के रूप में प्रस्तुत करते हैं, जो कि "dereferenceable" का एक विशेष मामला है। हालांकि, "भरोसेमंद नहीं है" इटरेटर के लिए "अमान्य" का अर्थ है। "अमान्य" को स्पष्ट रूप से "may be singular" के रूप में परिभाषित किया गया है, जबकि "एकवचन" मान को "किसी भी अनुक्रम से संबद्ध नहीं" के रूप में परिभाषित किया गया है ("अस्वीकार्य" की परिभाषा के समान पैराग्राफ में)। उस पैराग्राफ ने स्पष्ट रूप से "अतीत के अंत मूल्य" को भी परिभाषित किया है।
[iterator.requirements] में मानक के पाठ से, यह स्पष्ट है कि:
- विगत अंत मान dereferenceable (कम से कम मानक पुस्तकालय से) माना नहीं कर रहे हैं, के रूप में मानक राज्यों।
- भरोसेमंद मान एकवचन नहीं हैं, क्योंकि वे अनुक्रम से जुड़े हुए हैं।
- पिछले-अंत-अंत मूल्य एकवचन नहीं हैं, क्योंकि वे अनुक्रम से जुड़े हुए हैं।
- यदि यह निश्चित रूप से एकवचन नहीं है ("अवैध इटरेटर" की परिभाषा पर अस्वीकार करके) एक पुनरावर्तक अमान्य नहीं है। दूसरे शब्दों में, यदि कोई पुनरावृत्ति अनुक्रम से जुड़ा हुआ है, तो यह अमान्य नहीं है।
end()
का मूल्य एक पास्ट अंत मूल्य है, जो एक अनुक्रम साथ जुड़ा हुआ है इससे पहले कि यह अवैध है। तो यह वास्तव में परिभाषा के अनुसार मान्य है। शाब्दिक रूप से "अमान्य" पर गलत धारणा के साथ, पॉइंटर्स के नियम यहां लागू नहीं हैं।
ऐसे मानों पर ==
तुलना करने वाले नियम input iterator requirements में हैं, जो किसी अन्य श्रेणी के इटरेटर (आगे, द्विपक्षीय, आदि) द्वारा विरासत में प्राप्त होता है। अधिक विशेष रूप से, वैध iterators are required to be comparable in the domain of the iterator इस तरह से (==
)। इसके अलावा, अग्रेषण आवश्यकताओं को आगे the domain is over the underlying sequence निर्दिष्ट करता है। और कंटेनर आवश्यकताएं iterator
और const_iterator
सदस्य प्रकार in any iterator category meets forward iterator requirements निर्दिष्ट करती हैं। इस प्रकार, ==
end()
पर और उसी कंटेनर पर इटरेटर को अच्छी तरह से परिभाषित करने की आवश्यकता है। एक मानक कंटेनर के रूप में, vector<int>
भी आवश्यकताओं का पालन करता है। यह पूरी कहानी है।
तीसरा, यहां तक कि end()
एक सूचक मूल्य है (यह vector
उदाहरण के इटरेटर के अनुकूलित कार्यान्वयन के साथ होने की संभावना है), प्रश्न में नियम अभी भी लागू नहीं हैं। कारण ऊपर उल्लिखित कारण है (और कुछ अन्य उत्तरों में): "अमान्य" *
(अप्रत्यक्ष माध्यम से) से संबंधित है, तुलना नहीं। One-past-end value is explicitly allowed to be compared in specified ways by the standard. यह भी ध्यान दें कि आईएसओ सी ++ आईएसओ सी नहीं है, वे भी मिस्चैच को घटाते हैं (उदा। <
के लिए पॉइंटर वैल्यू पर, उसी सरणी में नहीं, अनिर्दिष्ट बनाम अपरिभाषित), हालांकि उनके यहां समान नियम हैं।
3.7.3.2/4 यह नहीं कहता कि एक अमान्य सूचक की प्रतिलिपि बनाना और कास्टिंग करना यूबी है। मेरा मानना है कि आपकी व्याख्या बहुत व्यापक है। –
@ किरील वी। लिडविंस्की: शायद, लेकिन यह लिंक किए गए प्रश्न का मूल है जहां आम सहमति यह है कि अमान्य पॉइंटर्स कास्टिंग और असाइन करना यूबी है। – sharptooth