मुझे पूरा यकीन नहीं है कि आपकी चिंता क्या है (और शायद आपको यह प्रश्न स्पष्ट करना चाहिए कि वह उत्तर पर्याप्त नहीं है), लेकिन m[10] += 1;
का अनुवाद m[10] = m[10] + 1;
पर नहीं किया गया है क्योंकि m
उपयोगकर्ता परिभाषित वर्ग प्रकार और ओवरलोडेड ऑपरेटर डॉन ' कभी संकलक द्वारा अनुवादित नहीं किया जाता है। एक उपयोगकर्ता परिभाषित वर्ग प्रकार के साथ a
और b
वस्तुओं के लिए:
a+=b
मतलब यह नहीं है a = a + b
a!=b
!(a==b)
मतलब यह नहीं है (जब तक आप ऐसा कर)
(जब तक आप ऐसा कर रहे हैं)
इसके अलावा, फ़ंक्शन कॉल को कभी भी डुप्लीकेट नहीं किया जाता है।
तो m[10] += 1;
का मतलब है कि एक बार operator[]
ओवरलोड किया गया; वापसी प्रकार एक संदर्भ है, इसलिए अभिव्यक्ति एक लाभा है; फिर lvalue में बिल्टिन ऑपरेटर +=
लागू करें।
मूल्यांकन समस्या का कोई आदेश नहीं है। मूल्यांकन के कई संभावित आदेश भी नहीं हैं! , vector
और deque
अनुक्रम अवधारणा के कार्यान्वयन (जहां स्थिति मामलों) कर रहे हैं:
इसके अलावा, आप कि std::map<>::operator[]
std::vector<>::operator[]
(या std::deque
की) की तरह व्यवहार नहीं करता है याद करने के लिए, की जरूरत है क्योंकि map
एक पूरी तरह से अलग अमूर्त है
std::vector<>::operator[]
एक संख्यात्मक सूचकांक लेता है, और मतलब नहीं है अगर इस तरह के सूचकांक वेक्टर का एक तत्व का उल्लेख नहीं करता: लेकिन map
एक साहचर्य कंटेनर (जहां "कुंजी" मामलों, नहीं स्थिति) है।
std::map<>::operator[]
एक कुंजी लेता है (जो किसी भी प्रकार की संतोषजनक मूल बाधाओं हो सकता है) और कोई (कुंजी, मान) जोड़ी बनाएगा यदि कोई भी मौजूद नहीं है।
ध्यान दें कि इस कारण के लिए, std::map<>::operator[]
स्वाभाविक एक बदलाव संचालन और इस प्रकार गैर स्थिरांक है, जबकि std::vector<>::operator[]
स्वाभाविक संशोधित नहीं किया गया है लेकिन उसके परिणाम में संदर्भ के माध्यम से संशोधन अनुमति दे सकते हैं, और इस प्रकार है, "संक्रामक" स्थिरांक: v[i]
v
एक गैर-कॉन्स वेक्टर और एक कॉन्स लैवल्यू है यदि v
एक कॉन्स वेक्टर है तो एक संशोधित अंतराल होगा।
इसलिए कोई चिंता नहीं, कोड पूरी तरह से परिभाषित व्यवहार है।
ऐसे प्रश्न वास्तव में दिखाते हैं कि भाषा अधिक जटिल हो गई है – Slava
यह ** यूबी ** कैसे हो सकता है? – Destructor
@ निर्माता, कृपया संपादन देखें, क्या कुछ बदलता है? – DimG