Laut cppreference.com wird std::map::operator[]
für nicht vorhandene Werte eine Nullinitialisierung durchgeführt .
Dieselbe Site erwähnt jedoch keine Nullinitialisierung für std::unordered_map::operator[]
, außer es gibt ein Beispiel, das sich darauf stützt.
Natürlich ist dies nur eine Referenzseite, nicht der Standard. Ist der folgende Code in Ordnung oder nicht?
#include <unordered_map>
int main() {
std::unordered_map<int, int> map;
return map[42]; // is this guaranteed to return 0?
}
std::optional
?std::optional
Objekt, das keinen enthaltenen Wert enthält, ist weiterhin ein initialisiertes Objekt.std::optional
has_value
würde es testen, aber es schlägt fehl, also denke ich, dass Sie richtig sind.Antworten:
Abhängig von der Überlastung, von der wir sprechen,
std::unordered_map::operator[]
entspricht dies [unord.map.elem](Die Überlastung, die eine r-Wert-Referenz nimmt, bewegt sich nur
k
hineintry_emplace
und ist ansonsten identisch.)Wenn ein Element unter Schlüssel
k
in der Karte vorhanden ist, wirdtry_emplace
ein Iterator für dieses Element und zurückgegebenfalse
. Andernfalls wirdtry_emplace
ein neues Element unter den Schlüssel eingefügtk
und ein Iterator an diesen undtrue
[unord.map.modifiers] zurückgegeben :Interessant für uns ist der Fall, dass es noch kein Element gibt [unord.map.modifiers] / 6 :
(Die Überlastung, die eine r-Wert-Referenz nimmt, bewegt sich nur
k
hineinforward_as_tuple
und ist ansonsten wieder identisch.)Da
value_type
es sich um einepair<const Key, T>
[unord.map.overview] / 2 handelt , wird das neue Kartenelement wie folgt erstellt:Da
args
es leer ist, wenn es von kommtoperator[]
, läuft dies darauf hinaus, dass unser neuer Wert als Mitglied vonpair
from no arguments [pairs.pair] / 14 konstruiert wird, was eine direkte Initialisierung [class.base.init] / 7 eines Wertes vom TypT
using ist()
als Initialisierer, der auf die Wertinitialisierung hinausläuft [dcl.init] /17.4 . Die Wertinitialisierung von aint
ist die Nullinitialisierung [dcl.init] / 8 . Und die Nullinitialisierung von a initialisiert diesint
natürlichint
auf 0 [dcl.init] / 6 .Also ja, Ihr Code gibt garantiert 0 zurück…
quelle
Auf der von Ihnen verlinkten Site heißt es:
Das
int
ist also wertinitialisiert :Deshalb ist das Ergebnis
0
.quelle