Hangi aşırı yükten bahsettiğimize bağlı olarak, [unord.map.elem]std::unordered_map::operator[] ile eşdeğerdir.
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(bir rvalue referansı alan aşırı yük sadece kiçine girer try_emplaceve aynıdır)
kHaritadaki anahtarın altında bir öğe varsa , o try_emplaceöğeye bir yineleyici ve döndürür false. Aksi takdirde, try_emplaceanahtarın altına yeni bir öğe ekler kve buna bir yineleyici ve true [unord.map.modifiers] döndürür :
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
Bizim için ilginç olan, henüz bir unsur olmamasıdır [unord.map.modifiers] / 6 :
Aksi takdirde value_type,piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(bir rvalue referansı alan aşırı yük sadece kiçine girer forward_as_tupleve yine aynıdır)
Yana value_typebir olduğunu pair<const Key, T> [unord.map.overview] / 2 , bu yeni harita elemanı olarak inşa edilecektir söyler:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
Yana argsgelen zaman boş olan operator[]bu yeni değeri bir üyesi olarak inşa edilen kaynar aşağı pairbir argümanlar [pairs.pair] / 14 doğrudan başlatma olan [class.base.init] / 7 tipte bir değer Tkullanılarak ()değer başlangıcına kadar kaybolan başlatıcı olarak [dcl.init] /17.4 . A değerinin başlatılması intsıfır başlatma [dcl.init] / 8'dir . Ve intdoğal olarak sıfır başlatma intbunu 0 [dcl.init] / 6 olarak başlatır .
Evet, kodunuzun 0 döndüreceği garantilidir…