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 k
içine girer try_emplace
ve aynıdır)
k
Haritadaki anahtarın altında bir öğe varsa , o try_emplace
öğeye bir yineleyici ve döndürür false
. Aksi takdirde, try_emplace
anahtarın altına yeni bir öğe ekler k
ve 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 k
içine girer forward_as_tuple
ve yine aynıdır)
Yana value_type
bir 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 args
gelen zaman boş olan operator[]
bu yeni değeri bir üyesi olarak inşa edilen kaynar aşağı pair
bir argümanlar [pairs.pair] / 14 doğrudan başlatma olan [class.base.init] / 7 tipte bir değer T
kullanılarak ()
değer başlangıcına kadar kaybolan başlatıcı olarak [dcl.init] /17.4 . A değerinin başlatılması int
sıfır başlatma [dcl.init] / 8'dir . Ve int
doğal olarak sıfır başlatma int
bunu 0 [dcl.init] / 6 olarak başlatır .
Evet, kodunuzun 0 döndüreceği garantilidir…