आपका कोड यूबी को आमंत्रित करता है, लेकिन launder
कारणों से नहीं। ऐसा इसलिए है क्योंकि p0[1].i
स्वयं यूबी है।
हाँ, वास्तव में ([Expr.Add]/4):
जब एक अभिव्यक्ति अभिन्न प्रकार है कि करने के लिए जोड़ा या एक सूचक से घटाया जाता है, परिणाम सूचक संकार्य के प्रकार है। यदि अभिव्यक्ति पी तत्वों के तत्व x [i] को तत्वों x के साथ इंगित करता है, n तत्वों के साथ x, अभिव्यक्ति पी + जे और जे + पी (जहां जे का मान जे है) इंगित करता है (संभावित-काल्पनिक) तत्व x [i + जे] अगर 0 ≤ मैं + जे ≤ एन; अन्यथा, व्यवहार अपरिभाषित है। इसी तरह, अभिव्यक्ति पी - जे इंगित करता है (संभवतः-काल्पनिक) तत्व x [i - j] अगर 0 ≤ i - j ≤ n; अन्यथा, व्यवहार अपरिभाषित है।
एक ऑब्जेक्ट जो सरणी तत्व नहीं है, इस उद्देश्य के लिए एकल-तत्व सरणी से संबंधित माना जाता है; 8.3.1 देखें। एन तत्वों के सरणी एक्स के अंतिम तत्व से पहले एक पॉइंटर को इस उद्देश्य के लिए एक अनुमानक तत्व x [n] के सूचक के बराबर माना जाता है; 6.9.2 देखें।
[]
जब पॉइंटर पर लागू होता है तो पॉइंटर अंकगणित करने का मतलब है। और सी ++ ऑब्जेक्ट मॉडल में, पॉइंटर अंकगणित केवल पॉइंटर्स पर टाइप किए जा रहे प्रकार की सरणी में तत्वों के लिए उपयोग किया जा सकता है। आप हमेशा ऑब्जेक्ट को लम्बाई 1 की सरणी के रूप में देख सकते हैं, ताकि आप एकल ऑब्जेक्ट के "एक अतीत के अंत में" पॉइंटर प्राप्त कर सकें। इस प्रकार, p0 + 1
मान्य है।
मान्य है उस पते पर संग्रहीत ऑब्जेक्ट तक पहुंच रहा है हालांकि पॉइंटर p0 + 1
के माध्यम से प्राप्त किया गया है। यही है, p0[1].i
अपरिभाषित व्यवहार है। यह से पहले यूबी जैसा है इसके बाद इसे लॉन्डर करना है।
अब, चलो एक अलग संभावना को देखते हैं:
X x[2];
x[1].~X(); //Destroy this object.
new(x + 1) X; //Construct a new one.
तो चलो कुछ सवाल पूछना है:
x[1]
यूबी है? मैं कहूंगा ... नहीं, यह यूबी नहीं है। क्यूं कर? क्योंकि x[1]
नहीं है:
एक सूचक है कि मूल वस्तु की ओर इशारा किया, एक संदर्भ है कि मूल वस्तु के रूप में भेजा, या मूल वस्तु सरणी और पहले के
x
अंक की नाम उस सरणी का तत्व, दूसरा तत्व नहीं। इसलिए, यह मूल वस्तु को इंगित नहीं करता है। यह एक संदर्भ नहीं है, न ही यह उस वस्तु का नाम है।
इसलिए, यह [basic.life]/8 द्वारा दिए गए प्रतिबंधों के लिए योग्य नहीं है। तो x[1]
को नव निर्मित वस्तु को इंगित करना चाहिए।
यह देखते हुए कि आपको launder
की आवश्यकता नहीं है।
तो यदि आप इसे कानूनी तरीके से कर रहे हैं, तो आपको launder
की आवश्यकता नहीं है।
'जोर नहीं है (पी 0 [1] == 43); एक अवैध अभिव्यक्ति? ... subexpression 'p0 [1]' द्वारा उत्पादित वर्ग प्रकार को ध्यान में रखते हुए कोई अधिभारित नहीं है 'ऑपरेटर == (एक्स, int) ' – WhiZTiM
@WhiZTiM स्पष्ट टाइपो स्पष्ट है? – Barry
यह वास्तव में एक टाइपो था। – Oliv