Bergantung pada kelebihan apa yang kita bicarakan, std::unordered_map::operator[]
setara dengan [unord.map.elem]
T& operator[](const key_type& k)
{
return try_emplace(k).first->second;
}
(kelebihan mengambil referensi-nilai hanya bergerak k
ke try_emplace
dan sebaliknya identik)
Jika elemen ada di bawah kunci k
di peta, lalu try_emplace
mengembalikan iterator ke elemen itu dan false
. Jika tidak, try_emplace
masukkan elemen baru di bawah kunci k
, dan kembalikan iterator ke sana dan true
[unord.map.modifiers] :
template <class... Args>
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);
Yang menarik bagi kami adalah belum ada elemen [unord.map.modifiers] / 6 :
Kalau tidak, menyisipkan objek tipe value_type
dibangun denganpiecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(Kelebihan mengambil referensi-nilai hanya bergerak k
ke forward_as_tuple
dan, sekali lagi, identik)
Sejak value_type
adalah pair<const Key, T>
[unord.map.overview] / 2 , ini memberitahu kita bahwa unsur peta baru akan dibangun sebagai:
pair<const Key, T>(piecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...));
Karena args
kosong ketika datang dari operator[]
, ini bermuara pada nilai baru kami dibangun sebagai anggota pair
dari tidak ada argumen [pairs.pair] / 14 yang merupakan inisialisasi langsung [class.base.init] / 7 dari nilai tipe T
menggunakan ()
sebagai inisialisasi yang bermuara pada nilai inisialisasi [dcl.init] /17.4 . Inisialisasi nilai suatu int
adalah inisialisasi nol [dcl.init] / 8 . Dan nol inisialisasi dari sebuah int
secara alami menginisialisasi int
ke 0 [dcl.init] / 6 .
Jadi ya, kode Anda dijamin untuk mengembalikan 0 ...