2012-12-07 17 views
5

Mögliche Duplizieren:
Why does stack<const string> not compile in g++?Vektor <const int> ist nicht erlaubt. Warum ist das Paar <const int, int> erlaubt?

An answer to another question erklärt, warum wir (angeblich) nicht Container von const Objekte. Zum Beispiel ist dies nicht erlaubt:

vector<const int> v; //not allowed 

Aber warum ein pair das erste Objekt erlauben const zu sein? Dies ist in der Tat, was mit dem pair s innerhalb eines map Objekts passiert. Fehle ich etwas?

Detaillierte und intuitive Erklärungen dieses Phänomens würden sehr geschätzt werden.

+0

'std :: pair' ist nicht gerade ein Container, oder? Sie dürfen auch ein 'const int' haben. –

Antwort

14

Ich denke, der Hauptgrund ist, weil std::pair Objekte nicht neu zuweisen, so dass sie nicht zuweisbar sein müssen.

Update:

Eigentlich Vektor ist der einzige Behälter, der belegbaren Objekten erfordert. Dies liegt daran, dass entsprechend dem Standardvektor ein zusammenhängender Speicherort für seine Elemente vorhanden sein muss. Wenn also kein Platz mehr für weitere Objekte vorhanden ist, muss der Vektor seine Daten an einem anderen Ort neu zuweisen (und somit die zuweisbare Eigenschaft der Objekte verwenden).

+1

Danke. Übrigens ist der Grund für meine "konstante" Obsession, dass ich nicht versehentlich Dinge modifiziere, die ich gar nicht modifizieren wollte. In diesem Fall möchte ich die Containerelemente nicht modifizieren, sondern nur dem Container hinzufügen. Vielleicht sollte ich "deque" statt "vector" verwenden? –

+0

@DennisRitchie: 'const Vektor ' kann die Antwort sein, die Sie suchen. – prazuber

+0

Ich muss in der Lage sein, dem Container Elemente hinzuzufügen und den ganzen Vektor 'const' nicht zulassen, oder? Ich möchte nur sicherstellen, dass ich Elemente, die sich bereits im Container befinden, nicht ändern kann. –

5

std::pair muss nur der Inhalt zugewiesen werden, wenn Sie versuchen, ihm zuzuordnen. Jedoch erfordert std::vector immer eine Zuweisung für Neuzuweisungszwecke.

+0

Hm. Würde das mit der neuen Move-Semantik noch gelten? –

+0

@NikosC. Ich nehme an, dass der Vektor in diesem Fall nur eine Bewegungszuweisung verwendet, was immer noch eine Zuweisung ist. Nur eine Vermutung. Jemand korrigiert mich, wenn ich falsch liege. –

+1

@NikosC-Typ muss kopierbar ODER beweglich sein. So können Sie zum Beispiel einen Vektor von unique_ptr haben, die nicht kopierbar sind. – nunojpg

Verwandte Themen