Według cppreference.com, std::map::operator[]
dla nieistniejącej wartości robi zerową inicjalizację.
Jednak ta sama strona nie wspomina o zerowej inicjalizacji std::unordered_map::operator[]
, z wyjątkiem tego, że opiera się na tym przykładzie.
Oczywiście jest to tylko strona referencyjna, a nie standard. Czy poniższy kod jest w porządku, czy nie?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
Obiekt, który posiada zawartą wartość nie jest wciąż zainicjowany obiekt.std::optional
has_value
to przetestuję, ale to się nie powiedzie, więc myślę, że masz rację.Odpowiedzi:
W zależności od przeciążenia, o którym mówimy,
std::unordered_map::operator[]
jest równoważne z [unord.map.elem](przeciążenie przyjmujące wartość odniesienia po prostu przenosi
k
siętry_emplace
i jest poza tym identyczne)Jeśli element istnieje pod kluczem
k
na mapie, totry_emplace
zwraca iterator do tego elementu ifalse
. W przeciwnym razietry_emplace
wstawia nowy element pod kluczk
i zwraca iterator do tego itrue
[unord.map.modifiers] :Interesujący jest dla nas brak elementu [unord.map.modifiers] / 6 :
(przeciążenie przyjmujące wartość odniesienia po prostu przenosi
k
sięforward_as_tuple
i znowu jest identyczne)Ponieważ
value_type
jest topair<const Key, T>
[unord.map.overview] / 2 , oznacza to, że nowy element mapy zostanie skonstruowany jako:Ponieważ
args
jest pusty, gdy przychodzi zoperator[]
, sprowadza się to do tego, że nasza nowa wartość jest konstruowana jako element składowy „pair
no arguments [pairs.pair] / 14, który jest bezpośrednią inicjalizacją [class.base.init] / 7 wartości typuT
przy użyciu()
jako inicjator sprowadzający się do inicjalizacji wartości [dcl.init] /17.4 . Inicjalizacja wartościint
to inicjalizacja zerowa [dcl.init] / 8 . I zerowa inicjalizacjaint
naturalnie inicjuje toint
do 0 [dcl.init] / 6 .Więc tak, twój kod ma gwarancję zwrotu 0…
źródło
Na stronie, którą podlinkowałeś, napisano:
Więc
int
jest wartość zainicjowany :Właśnie dlatego wynik jest
0
.źródło