Warum kannst du kein const-Objekt in einen STL-Container legen?

8

Siehe den folgenden Code - Ich versuche ein konstantes Objekt in einen Vektor zu setzen. Ich weiß, die Antwort lautet: "STL-Container erfordern, dass Objekte zuweisbar und kopierbar sind", aber ohne den Standard zu zitieren, kann jemand erklären, was das Problem dabei ist? Ich verstehe nicht, warum eine Klasse wie diese nicht kopiert werden kann (außerdem erlaubt c ++ das nicht).

Es ist nur ein gespeicherter Wert, der nicht geändert werden darf. Warum kann er nicht in einen Vektor eingefügt werden, um einfach ein anderes dieser Objekte zu erstellen?

%Vor%

BEARBEITEN:

Dies ist mit std :: set und std :: list möglich. Ich denke, es ist die Funktion sort () in std :: vector, die Zuweisung verwendet. Das ist nicht UB oder?

%Vor%     
David Doria 31.12.2011, 00:04
quelle

3 Antworten

6

EDIT2: (Entfernen einer Menge Sachen, die nicht funktionieren müssen) Der C ++ 11 Standard gibt an, dass die insert Methode für vector und deque (und die Standardimplementierung von push_back für (Das ist wichtig) erfordert den Werttyp CopyAssignable , dh der Wert unterstützt:

%Vor%

Klassen und Strukturen mit const -Members sind standardmäßig nicht CopyAssignable . Was Sie also tun möchten, funktioniert nicht.

Dieses Dokument (n3173) enthält eine Erklärung dafür die verschiedenen Containeranforderungen.

    
MSN 31.12.2011, 00:07
quelle
1

Eine mögliche Lösung wäre, Zeiger auf die Objekte im Vektor zu speichern, da Zeiger zuweisbar und kopierbar sind.

Eine andere mögliche Lösung wäre, x ohne das Schlüsselwort const zu deklarieren, aber stellen Sie sicher, dass es nicht durch Kapselung geändert werden kann (d. h. Sie sollten es als privat deklarieren und von außerhalb des Konstruktors nicht modifizieren).

    
WebMonster 31.12.2011 00:12
quelle
0

Wenn Sie ein Objekt vom Typ MyClass in den std :: vector einfügen, erstellt der Vektor eine Kopie des Objekts für den Speicher und nicht das Objekt, das Sie ihm übergeben haben.

    
Eddie Paz 31.12.2011 00:07
quelle

Tags und Links