2010-02-23 14 views
11

मैंने देखा कि संदर्भ का कोई संदर्भ नहीं है लेकिन पॉइंटर के लिए सूचक है, और संदर्भों की कोई सरणी नहीं है लेकिन पॉइंटर्स की एक सरणी है।सी ++: संदर्भों या संदर्भों के सरणी के संदर्भ में हमारे पास संदर्भ क्यों नहीं हो सकते?

क्या कोई मुझे कोई कारण दे सकता है?

+7

क्योंकि बजेर्न स्ट्रॉस्ट्रप ऐसा कहता है। –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1164266/why-arrays-of-references-are-illegal –

+1

ऐसे उबाऊ जवाब। जवाब देने के बारे में कैसे मानक इसे अस्वीकार करता है? क्या कोई मौलिक कारण है कि सी ++ रिबाइंडिंग संदर्भों का समर्थन नहीं कर सकता है? –

उत्तर

15

पॉइंटर्स म्यूटेबल (यदि गैर-कॉन्स) हैं, तो संदर्भ कभी नहीं। इस प्रकार किसी संदर्भ के सूचक या संदर्भ होने का कोई मतलब नहीं है।

इसके अलावा, एक संदर्भ हमेशा कुछ संदर्भित करना चाहिए - शून्य संदर्भ के रूप में ऐसी कोई चीज़ नहीं है। यही कारण है कि संदर्भों का कोई सरणी नहीं हो सकता है, क्योंकि एक सरणी के भीतर एक सार्थक मूल्य को डिफ़ॉल्ट तत्काल संदर्भों का कोई तरीका नहीं है।

+1

अब हमारे पास सी ++ 11 में सरणी प्रारंभिकरण है, ऐसा लगता है कि संदर्भों के सरणी हो सकती हैं। – Gurgeh

+1

हमेशा सरणी प्रारंभिक रहा है, और मुझे नहीं लगता कि क्यों int और refs [2] = {x, y}; अनैतिक है – Slava

12

यह सी ++ स्टैंडर्ड 8.3.2/4 के अनुसार:

वहाँ संदर्भ के लिए संदर्भ के लिए कोई संदर्भ, संदर्भ की कोई सरणियों, और कोई संकेत होगा।

+0

रैल्यू संदर्भ संदर्भों के संदर्भ नहीं हैं, हालांकि उनके वाक्यविन्यास '&&' सुझाव दे सकते हैं। – fredoverflow

+7

-1 मेरे लिए डाउनवोट करने के लिए बहुत दुर्लभ है, लेकिन मेरा मतलब वास्तव में, इस उत्तर का क्या मतलब है? यहां कुछ पोस्टर कल्पना करते हैं कि मानक एक प्रकार की पवित्र पुस्तक है। सबसे पहले आपको एक ऐसी भाषा की आवश्यकता है जो उपयोगी और समझ में आता है, केवल तभी मानक आवश्यक है। –

+4

@ बिल: मानकों द्वारा भाषाओं को परिभाषित किए जाने पर, पहली बार एक भाषा में एक मानक कैसे होता है? सी ++ भाषा अकेले मानक द्वारा * परिभाषित * है; सी ++ के बारे में कोई सवाल केवल मानक से जानकारी के साथ जवाब दे सकता है। इसके बजाय आप उत्तर के रूप में क्या प्रस्तावित करेंगे? – GManNickG

10

एक संदर्भ भाषा स्तर पर एक अमूर्त है। यह एक परिवर्तनीय को दूसरे में अलियासिंग का एक अपारदर्शी तरीका है। हुड के तहत, कंपाइलर पॉइंटर्स का उपयोग करके संदर्भों को काम करने की संभावना है, वे उच्च स्तर पर बहुत अलग चीजें हैं। दूसरी तरफ, संकेतक प्राप्त करने के लिए पॉइंटर्स का उपयोग प्रोग्रामर द्वारा स्पष्ट रूप से किया जाता है। एक पॉइंटर वैरिएबल एक अलग चर है जो इसकी ओर इशारा करता है। एक संदर्भ को सोचा जाना चाहिए कि यह मूल चर के लिए केवल उपनाम है, ऐसा नहीं है कि यह एक और चर है जो एक पता है। नतीजतन, एक चर के उपनाम के लिए एक उपनाम केवल चर के लिए एक उपनाम होगा। एक चर के संदर्भ में बाध्यकारी को ध्यान में रखते हुए एक संकलन-समय की बात इस व्यवहार के पीछे तर्क को समझने में मदद कर सकती है।

इस तर्क के साथ, आप तर्क दे सकते हैं कि चूंकि सरणी संरचनाएं हैं जो मूल्यों को स्टोर करती हैं, वैरिएबल नहीं, यह उनके लिए चर के उपनामों को स्टोर करने में सक्षम नहीं होती है। असल में, एक संदर्भ चर (जिसका अर्थ है कि सूचक, यदि मौजूद है, तो संदर्भ को तार करने के लिए कंपाइलर द्वारा उपयोग किया जा सकता है) C++ स्तर पर प्रोग्रामर के लिए अदृश्य है। यदि संदर्भों के सरणी घोषित करना संभव था, तो संकलक को संकलन समय पर बाध्यकारी को हल करने में सक्षम होने के लिए सरणी को पारित निरंतर अनुक्रमणिका की आवश्यकता होती है।

+0

यह एकमात्र उत्तर है जो वास्तव में बताता है कि मानक किसी भी कार्यान्वयन को संदर्भों के सरणी को अनुमति देने के लिए क्यों नहीं चाहता है। – Chani

4

सी ++ स्टैंडर्ड 8.3.2/4:

There shall be no references to references, no arrays of references, and no pointers to references.

इस के पीछे तर्क है कि एक संदर्भ रन-टाइम में में और स्वयं का मौजूद नहीं है। एक संदर्भ केवल एक स्थान के लिए एक और नाम है। वे अपरिवर्तनीय हैं।

+3

संदर्भ स्मृति पर कब्जा कर रहे हैं। जांचें कि 'स्ट्रक्चर एक्स {int & x; लंबा और एक्स; } उदाहरण के लिए। –

+0

डेविड, रचनाकार सरलता के लिए छोड़ा गया। –

+0

संदर्भ रनटाइम पर बहुत मौजूद हैं। बाइनरी में अपना कॉल स्टैक देखें। उन्हें अपने ऑब्जेक्ट्स पर पतों को इंगित करें! :) – Macke

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