Fehler mit 'std :: vector std :: unique_ptr T'

8

Ich sehe einige Fehler, die std::vector< std::unique_ptr< T > > mit std::move umgehen. Der Code, der das Problem reproduziert, ist dies:

%Vor%

Mit clang 3.4 erzeugt dieser Code diesen Fehler:

%Vor%

Die Situationen scheinen mit g ++ 4.8 nicht besser zu sein:

%Vor%

Laut dieser Antwort und den Kommentaren sollte dies nicht bei diesen Compilern passieren, aber ich bin es nicht Genau das gleiche: Ich versuche den Vektor mit einer Initialisierungsliste zu initialisieren.

Irgendeine Idee, was passieren muss, damit dieser Code korrekt erstellt wird?

    
lurscher 22.07.2015, 01:09
quelle

2 Antworten

8

Die verwendete braced-init-Liste in der return-Anweisung in getVector

%Vor%

führt zu einem Aufruf des Konstruktors std::vector<T> , der das Argument initializer_list<T> verwendet. Auch wenn Sie unique_ptr verschieben, ist ein initializer_list nur const Zugriff auf seine Elemente möglich , fällig zu dem der vector versucht, den unique_ptr zu kopieren, was zu dem angezeigten Fehler führt.

Sie können den Fehler beheben, indem Sie eine ausführlichere Methode zum Erstellen von vector

verwenden %Vor%

Live-Demo

Um der Neugier willen ist es möglich, ein vector aus einem Array von Nur-Bewegung-Objekten zu konstruieren, aber Sie müssen std::move_iterator um die Elemente zu verschieben.

%Vor%     
Praetorian 22.07.2015, 01:23
quelle
-1

Ihr vtype ist ein Vektor von eindeutigen Zeigern und Sie kehren zu ihm einen eindeutigen Zeiger zurück.

Da Sie die Bewegung im Konstruktor foo ausführen, müssen Sie keine Bewegung zurückgeben Schau dir diesen Code an:

%Vor%     
Mido 22.07.2015 02:29
quelle