2012-06-15 24 views
18

हम जानते हैं कि यदि हम ऑपरेटर [] के साथ std::map की किसी भी अनन्य कुंजी तक पहुंचने का प्रयास नहीं करते हैं, तो फ़ंक्शन उस कुंजी के साथ एक नया तत्व डालेगा।नक्शा ऑपरेटर [] और बूल मूल्य के रूप में

हम: std::map<std::string, bool> map_xxx;

यह है कि इसकी गारंटी map_xxx["nonexistent_key"] की अस्तित्वहीन कुंजी तक पहुँचने के बाद है, दूसरा तर्क का मूल्य हमेशा false हो जाएगा?

ps। यदि नहीं, तो कोई विचार यह व्यवहार कैसे करें?

+0

मुझे लगता है कि आपका प्रश्न वास्तव में है: "इस पृष्ठ पर दिखाए गए कोड से स्पष्ट रूप से 'बूल()'? "का मूल्य क्या है (http://en.cppreference.com/w/ सीपीपी/कंटेनर/मानचित्र/operator_at)। – chris

+0

संभव डुप्लिकेट [क्या std :: pair <> मूल प्रकार (int, आदि) के डिफ़ॉल्ट कन्स्ट्रक्टर को शून्य पर सेट करता है?] (Http://stackoverflow.com/questions/9025792/does-the-default-constructor-of -stdpair-सेट बुनियादी प्रकार-पूर्णांक-आदि-टू-जीरो) – ildjarn

उत्तर

26

हां। डालने वाला मान false होने की गारंटी है।


सी ++ 98 में, तंत्र डिफ़ॉल्ट प्रारंभ बुलाया गया था, गैर कक्षाओं के लिए शून्य प्रारंभ के रूप में निर्दिष्ट; Booleans के लिए false है।

सी ++ 03 के बाद से, तंत्र को मूल्य प्रारंभिक कहा जाता है, फिर भी गैर-कक्षाओं के लिए शून्य प्रारंभिक के रूप में निर्दिष्ट किया जाता है; और इस प्रकार बूलियन के लिए अभी भी false। उदाहरण के लिए, देखते हैं कि इस पर सी ++ 14 क्या कहना है।

§23.4.4.3 से; "टी" के लिए बस bool को प्रतिस्थापित करें।

टी & ऑपरेटर [] (स्थिरांक key_type & x);

  1. प्रभाव: यदि नक्शे में एक्स के लिए कोई कुंजी बराबर है, नक्शे में सम्मिलित करता है VALUE_TYPE (एक्स, टी())।
  2. आवश्यक है: key_type प्रतिलिपि होगी और mapped_type डिफ़ॉल्ट होगा * में।

§8.5 से, नीचे से ऊपर को पचाने पैराग्राफ:

करने के लिए एक वस्तु या प्रकार टी के संदर्भ शून्य से प्रारंभ का अर्थ है:

- अगर टी एक अदिश प्रकार है (3.9), ऑब्जेक्ट द्वारा प्राप्त मूल्य के लिए प्रारंभ किया गया है पूर्णांक अक्षर (शून्य) टी में कनवर्ट करना;

...

करने के लिए मूल्य-प्रारंभ प्रकार टी की एक वस्तु का अर्थ है:

- अगर टी (संभवत: सीवी-योग्य) वर्ग प्रकार (धारा 9) या तो कोई डिफ़ॉल्ट निर्माता के साथ है (12।1) या एक डिफ़ॉल्ट कन्स्ट्रक्टर जो उपयोगकर्ता द्वारा प्रदत्त या हटाया गया है, तो ऑब्जेक्ट डिफ़ॉल्ट-प्रारंभिक है;

- यदि टी उपयोगकर्ता द्वारा प्रदत्त या हटाए गए डिफ़ॉल्ट कन्स्ट्रक्टर के बिना एक (संभवतः सीवी-योग्य) वर्ग प्रकार है, तो ऑब्जेक्ट शून्य-प्रारंभिक है और डिफ़ॉल्ट-प्रारंभिकता के लिए अर्थपूर्ण बाधाओं की जांच की जाती है, और यदि टी में कोई है गैर-तुच्छ डिफ़ॉल्ट डिफॉल्ट कन्स्ट्रक्टर, ऑब्जेक्ट डिफ़ॉल्ट-प्रारंभिक है;

- यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व मूल्य-प्रारंभिक है;

- अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।

...

एक वस्तु जिसका प्रारंभकर्ता कोष्ठकों के एक खाली सेट है, जैसे कि, (), होगा मूल्य प्रारंभ

§4.12 से

:

गणित, unscoped गणन, सूचक, या सूचक सदस्य प्रकार के एक prvalue प्रकार bool के prvalue में बदला जा सकता। शून्य मान, शून्य सूचक मूल्य, या शून्य सदस्य सूचक मूल्य को झूठी में परिवर्तित कर दिया गया है; कोई अन्य मूल्य सत्य में परिवर्तित हो जाता है। प्रत्यक्ष-प्रारंभिकरण (8.5) के लिए, प्रकार std :: nullptr_t का एक प्रकार टाइप बूल के प्रसार में परिवर्तित किया जा सकता है; परिणामस्वरूप मूल्य गलत है।