हम जिस ओवरलोड के बारे में बात कर रहे हैं, उसके आधार पर [unord.map.elem] केstd::unordered_map::operator[]
बराबर है
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(एक अधिभार-संदर्भ लेने वाला अधिभार बस में चला जाता k
है try_emplace
और अन्यथा समान है)
यदि कोई तत्व k
नक्शे में कुंजी के नीचे मौजूद है , तो try_emplace
उस तत्व के लिए एक पुनरावृत्ति देता है और false
। अन्यथा, try_emplace
कुंजी के तहत एक नया तत्व सम्मिलित करता है k
, और उस true
[[unord.map.modifiers] के लिए एक पुनरावृत्ति देता है :
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
हमारे लिए दिलचस्प यह है कि वहां कोई तत्व अभी तक मौजूद नहीं है [unord.map.modifiers] / 6 :
अन्यथा value_type
निर्मित प्रकार की वस्तु सम्मिलित करता हैpiecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(एक अधिभार-संदर्भ लेने वाला अधिभार बस में चला जाता k
है forward_as_tuple
और, फिर से, अन्यथा समान है)
चूंकि value_type
एक pair<const Key, T>
[unord.map.overview] / 2 है , यह हमें बताता है कि नए मानचित्र तत्व का निर्माण इस प्रकार किया जाएगा:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
चूंकि args
खाली आने के बाद से operator[]
, यह pair
बिना किसी तर्कों के जोड़े के जोड़े के रूप में बनाए जा रहे हमारे नए मूल्य के लिए उबलता है [जोड़े.पेयर] / 14 जो प्रत्यक्ष आरंभीकरण है [class.base.init] / 7 प्रकार के मूल्य का T
उपयोग करना ()
आरंभीकरण के रूप में जो मूल्य आरंभीकरण के लिए उबलता है [dcl.init] /17.4 । एक के मूल्य आरंभीकरण int
शून्य आरंभीकरण है [dcl.init] / 8 । और int
स्वाभाविक रूप से शून्य आरंभीकरण, int
0 [dcl.init] / 6 को आरंभ करता है ।
तो हां, आपका कोड 0 लौटने की गारंटी है ...