Menurut cppreference.com, std::map::operator[]
untuk nilai yang tidak ada tidak melakukan inisialisasi nol.
Namun, situs yang sama tidak menyebutkan inisialisasi nol untuk std::unordered_map::operator[]
, kecuali ia memang memiliki contoh yang bergantung pada ini.
Tentu saja ini hanya situs referensi, bukan standar. Jadi, apakah kode di bawah ini ok atau tidak?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
objek yang memegang nilai tidak ada yang terkandung masih merupakan objek diinisialisasi.std::optional
has_value
akan mengujinya tetapi gagal, jadi saya kira Anda benar.Jawaban:
Bergantung pada kelebihan apa yang kita bicarakan,
std::unordered_map::operator[]
setara dengan [unord.map.elem](kelebihan mengambil referensi-nilai hanya bergerak
k
ketry_emplace
dan sebaliknya identik)Jika elemen ada di bawah kunci
k
di peta, lalutry_emplace
mengembalikan iterator ke elemen itu danfalse
. Jika tidak,try_emplace
masukkan elemen baru di bawah kuncik
, dan kembalikan iterator ke sana dantrue
[unord.map.modifiers] :Yang menarik bagi kami adalah belum ada elemen [unord.map.modifiers] / 6 :
(Kelebihan mengambil referensi-nilai hanya bergerak
k
keforward_as_tuple
dan, sekali lagi, identik)Sejak
value_type
adalahpair<const Key, T>
[unord.map.overview] / 2 , ini memberitahu kita bahwa unsur peta baru akan dibangun sebagai:Karena
args
kosong ketika datang darioperator[]
, ini bermuara pada nilai baru kami dibangun sebagai anggotapair
dari tidak ada argumen [pairs.pair] / 14 yang merupakan inisialisasi langsung [class.base.init] / 7 dari nilai tipeT
menggunakan()
sebagai inisialisasi yang bermuara pada nilai inisialisasi [dcl.init] /17.4 . Inisialisasi nilai suatuint
adalah inisialisasi nol [dcl.init] / 8 . Dan nol inisialisasi dari sebuahint
secara alami menginisialisasiint
ke 0 [dcl.init] / 6 .Jadi ya, kode Anda dijamin untuk mengembalikan 0 ...
sumber
Di situs yang Anda tautkan tertulis:
Jadi
int
adalah nilai-diinisialisasi :Inilah sebabnya hasilnya
0
.sumber