Ich war überrascht, als die Erklärung:
%Vor%würde es mir nicht erlauben, nicht-konstante Methoden auf Foo * aufzurufen. Ich dachte, dass const auf die Sammlung selbst angewendet würde (d. H., Keine Elemente könnten hinzugefügt oder entfernt werden). Ich würde denken, der Weg, um Artikel Const zu vermitteln wäre:
%Vor%Es scheint, dass das const im ersten Code-Snippet auf den Inhalt der Map verteilt ist und nicht nur auf die Collection zutrifft.
Fehle ich hier etwas? Es scheint kontraintuitiv zu sein. Wie kann ich nicht-konstante Methoden auf den Foo * -Objekten in der ersten Deklaration aufrufen?
Sie müssen etwas falsch machen - operator[]
auf std::map
wird nicht als const
deklariert und kann daher nicht für den Zugriff auf Elemente der Karte verwendet werden. Der Grund dafür ist nicht const
, denn wenn der Schlüssel nicht in der Map vorhanden ist, wird er mit einem standardkonstruierten Wert zur Map hinzugefügt und ändert dabei die Map.
Verwenden Sie stattdessen die Methode find
, um einen Iterator zu erhalten. Der zurückgegebene Iterator kann nicht zum Ändern der Map verwendet werden, aber er kann zum Ändern der Objekte verwendet werden, auf die die Werte zeigen. Der folgende Code kompiliert und gibt beispielsweise 4
:
Ihr std::map
wird als const
deklariert. Sie erhalten wahrscheinlich nur const iterators
daraus.
Sie können []
auch nicht für std::map
verwenden, da dies einen Verweis auf das map-Element zurückgibt, was bedeutet, dass Sie es ändern könnten - daher handelt es sich um einen Compilerfehler.
Um Ihre Frage zu vervollständigen, setzt std::map
trotzdem seinen Schlüsseltyp: std::map<double, Foo*>::value_type
ist std::pair<const double, Foo*>
. Wenn Sie dem Schlüsseltyp const
hinzufügen, wird const const double
einfach auf const double
reduziert.
Tags und Links c++