2012-04-17 13 views
5
for (Something something : setOfSomething)   // OK 
for (Something const& something : setOfSomething) // OK 
for (Something& something : setOfSomething)   // ERROR 

error: invalid initialization of reference of type 'Something&' 
from expression of type 'const Something' 

में एसटीएल कंटेनर के किसी तत्व के संदर्भ को प्राप्त करना, जब सेटरेटर const Something लौटाता है? इसे Something& या Something const& वापस करना चाहिए। और चूंकि रेंज-आधारित 'फॉर' लूप का अर्थ that जैसा है, मेरे पास क्या हो रहा है इसके लिए कोई व्यावहारिक स्पष्टीकरण नहीं है।सी ++ 11 रेंज-आधारित 'फॉर' लूप

संपादित करें: मैं 10 के बजाय unordered_set के बारे में बात कर रहा हूं, इस भ्रम के बारे में खेद है।

उत्तर

13

आप set के सदस्यों को म्यूटेट नहीं कर सकते क्योंकि यह set इनवेरिएंट का उल्लंघन कर सकता है। तो संकलक आपको कॉन्स संदर्भ प्राप्त करने या प्रतिलिपि बनाने की अनुमति देता है।

+0

यदि मैं अपनी वस्तु को संशोधित करता हूं तो किस प्रकार के आविष्कारों को तोड़ दिया जा सकता है। मेमोरी लोकेशन और साइज जो यह रखता है, बिना छेड़छाड़ करता है - और ये दो चीजें एकमात्र हैं जिन्हें 'सेट' को नियंत्रित करना है। इसके अलावा, अगर मेरे पास मेरा कंटेनर है तो क्या होगा? कंपाइलर मेरे कंटेनरों पर इस तरह के प्रतिबंध क्यों लगाएगा? ईमानदार होने के लिए, यह एक गंदे हैक की तरह दिखता है। –

+1

'सेट' में ऑब्जेक्ट्स का ऑर्डरिंग बदल दिया जा सकता है यदि आप' ऑब्जेक्ट 'की तुलना में अपनी ऑब्जेक्ट के कुछ हिस्सों को अपडेट करते हैं। यदि यह समस्या 'std :: set' या उसके किसी भी रिश्तेदार (बहु, अनियंत्रित, आदि) के अलावा किसी कंटेनर के साथ हो रही है, तो क्या आप कृपया अपने प्रश्न में विनिर्देशों और अधिक कोड को संपादित कर सकते हैं? –

+0

तब मेरी समस्या है - मैं तब बेवकूफ हूं, लेकिन यह संकलक का व्यवसाय नहीं है। इसके अलावा, मैं इसे अभी भी पुरानी शैली के इटरेटर लूप के अंदर संशोधित कर सकता हूं। –

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