Selon cppreference.com, std::map::operator[]
pour une valeur non existante, l'initialisation à zéro est effectuée.
Cependant, le même site ne mentionne pas l'initialisation zéro pour std::unordered_map::operator[]
, sauf qu'il a un exemple qui s'appuie sur cela.
Bien sûr, ce n'est qu'un site de référence, pas la norme. Alors, le code ci-dessous est-il correct ou non?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
objet qui ne contient aucune valeur contenue est toujours un objet initialisé.std::optional
has_value
le tester, mais il échoue, donc je suppose que vous avez raison.Réponses:
Selon la surcharge dont nous parlons,
std::unordered_map::operator[]
équivaut à [unord.map.elem](la surcharge prenant une référence rvalue se déplace simplement
k
danstry_emplace
et est par ailleurs identique)Si un élément existe sous clé
k
dans la carte,try_emplace
retourne alors un itérateur à cet élément etfalse
. Sinon,try_emplace
insère un nouvel élément sous la clék
, et renvoie un itérateur à celui-ci ettrue
[unord.map.modifiers] :Intéressant pour nous est le cas où il n'y a pas encore d'élément [unord.map.modifiers] / 6 :
(la surcharge en prenant une référence rvalue se déplace juste
k
enforward_as_tuple
et, encore une fois, est par ailleurs identique)Puisque
value_type
c'est unpair<const Key, T>
[unord.map.overview] / 2 , cela nous dit que le nouvel élément de carte sera construit comme:Puisque
args
est vide en venant deoperator[]
, cela revient à notre nouvelle valeur étant construite en tant que membre de l'pair
argument no [pairs.pair] / 14 qui est l'initialisation directe [class.base.init] / 7 d'une valeur de typeT
using()
comme initialiseur qui se résume à l'initialisation de la valeur [dcl.init] /17.4 . L'initialisation de la valeur d'unint
est une initialisation nulle [dcl.init] / 8 . Et l'initialisation nulle de anint
initialise naturellement celaint
à 0 [dcl.init] / 6 .Alors oui, votre code est garanti pour retourner 0…
la source
Sur le site que vous avez lié, il est écrit:
Donc, la valeur
int
est initialisée :C'est pourquoi le résultat est
0
.la source