हम जिस ओवरलोड के बारे में बात कर रहे हैं, उसके आधार पर [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स्वाभाविक रूप से शून्य आरंभीकरण, int0 [dcl.init] / 6 को आरंभ करता है ।
तो हां, आपका कोड 0 लौटने की गारंटी है ...