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 kke try_emplacedan sebaliknya identik)
Jika elemen ada di bawah kunci kdi peta, lalu try_emplacemengembalikan iterator ke elemen itu dan false. Jika tidak, try_emplacemasukkan 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_typedibangun denganpiecewise_construct, forward_as_tuple(k), forward_as_tuple(std::forward<Args>(args)...)
(Kelebihan mengambil referensi-nilai hanya bergerak kke forward_as_tupledan, sekali lagi, identik)
Sejak value_typeadalah 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 argskosong ketika datang dari operator[], ini bermuara pada nilai baru kami dibangun sebagai anggota pairdari tidak ada argumen [pairs.pair] / 14 yang merupakan inisialisasi langsung [class.base.init] / 7 dari nilai tipe Tmenggunakan ()sebagai inisialisasi yang bermuara pada nilai inisialisasi [dcl.init] /17.4 . Inisialisasi nilai suatu intadalah inisialisasi nol [dcl.init] / 8 . Dan nol inisialisasi dari sebuah intsecara alami menginisialisasi intke 0 [dcl.init] / 6 .
Jadi ya, kode Anda dijamin untuk mengembalikan 0 ...