std :: vector :: erase () möchte sich nicht bewegen

9

Ich habe eine std::vector<Foo> , wobei Foo eine Klasse ist, die Foo( Foo&& ) noexcept enthält.

Das Hinzufügen von Objekten zum Container funktioniert einwandfrei, jedoch löscht GCC 4.7 beim Löschen mit std::vector::erase( iterator ) den Zuweisungsoperator, den ich gelöscht habe. Die genaue Fehlermeldung lautet:

Fehler: Verwendung der gelöschten Funktion 'Foobar & amp; Foobar :: operator = (const Foobar & amp;)

Bearbeiten: Natürlich ruft std::vector den Zuweisungsoperator auf, nicht den Kopierkonstruktor (das sehen Sie auch in der Fehlermeldung). Behebt es in der Beschreibung, sorry.

Hier ist ein Beispiel-Quellcode wie angefordert:

%Vor%     
stschindler 28.09.2012, 09:40
quelle

3 Antworten

11

Das Problem besteht darin, dass Sie keinen Zugzuweisungsoperator angegeben haben. Dies ist Teil des Vektors Bewegliche Anforderungen für einige Funktionen.

    
Puppy 28.09.2012, 09:54
quelle
2

Ich konnte es nicht reproduzieren. Stellt sich heraus, gute Gewohnheiten gehen einen langen Weg: Ich hatte die Bewegung Asignment-Operator definiert.

Live auf GCC 4.7.2: Ссылка

%Vor%     
sehe 28.09.2012 09:48
quelle
1

Die Antwort von DeadMG ist hervorragend, aber ich würde gerne eine andere Möglichkeit zum Schreiben des Zuweisungsoperators propagieren:

%Vor%

Da Sie zu Beginn der Methode ein neues temporäres Objekt benötigen, wählt der Compiler entweder den Kopier- oder den Verschiebungskonstruktor aus, um dieses temporäre Objekt zu erstellen, und Sie müssen nicht einen Kopierzuweisungsoperator UND eine Verschiebungszuweisung schreiben Betreiber:)

    
Matthieu M. 28.09.2012 10:11
quelle

Tags und Links