De acordo com cppreference.com, std::map::operator[]
para valor inexistente, a inicialização é zero.
No entanto, o mesmo site não menciona inicialização zero std::unordered_map::operator[]
, exceto que possui um exemplo que depende disso.
Claro que este é apenas um site de referência, não o padrão. Então, o código abaixo está ok ou não?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
objeto que não contém valor contido ainda é um objeto inicializado.std::optional
has_value
iria testá-lo, mas ele falha, então acho que você está correto.Respostas:
Dependendo de qual sobrecarga estamos falando,
std::unordered_map::operator[]
é equivalente a [unord.map.elem](a sobrecarga tendo uma referência rvalue apenas se move
k
paratry_emplace
e é de outro modo idêntica)Se um elemento existir sob a chave
k
no mapa,try_emplace
retornará um iterador para esse elemento efalse
. Caso contrário,try_emplace
insere um novo elemento sob a chavek
e retorna um iterador para isso etrue
[unord.map.modifiers] :Interessante para nós é o caso de ainda não haver nenhum elemento [unord.map.modifiers] / 6 :
(a sobrecarga que toma uma referência rvalue apenas se move
k
paraforward_as_tuple
e, novamente, é idêntica)Como
value_type
é umpair<const Key, T>
[unord.map.overview] / 2 , isso nos diz que o novo elemento do mapa será construído como:Como
args
está vazio quando vem deoperator[]
, isso se resume ao nosso novo valor sendo construído como membro dospair
argumentos from from [pairs.pair] / 14, que é a inicialização direta [class.base.init] / 7 de um valor do tipoT
using()
como inicializador, que se resume à inicialização de valor [dcl.init] /17.4 . A inicialização do valor de umint
é inicialização zero [dcl.init] / 8 . E a inicialização zero de umint
naturalmente inicializa issoint
para 0 [dcl.init] / 6 .Então, sim, seu código está garantido para retornar 0…
fonte
No site que você vinculou, diz:
Portanto, o valor
int
é inicializado :É por isso que o resultado é
0
.fonte