Nehmen wir an, ich habe eine Foo
Klasse mit einem std::vector
aus std::unique_ptr
Objekte einer anderen Klasse, Bar
.Warum benötigt dies eine explizite std :: move?
typedef std::unique_ptr<Bar> UniqueBar;
class Foo {
std::vector<UniqueBar> bars;
public:
void AddBar(UniqueBar&& bar);
};
void Foo::AddBar(UniqueBar&& bar) {
bars.push_back(bar);
}
Dieses eine führt zu einem Übersetzungsfehler (in g ++ 4.8.1) sagen, dass das der Kopierkonstruktor von std::unique_ptr
gelöscht wird, was sinnvoll ist. Die Frage hier ist, da das bar-Argument bereits eine rvalue-Referenz ist, warum wird der Kopierkonstruktor von std::unique_ptr
anstelle von seinem Move-Konstruktor aufgerufen?
Wenn ich explizit std::move
in Foo::AddBar
aufrufen, dann geht das Kompilierungsproblem weg, aber ich verstehe nicht, warum dies benötigt wird. Ich denke, es ist ziemlich überflüssig.
Also, was fehlt mir?
auch wird die 'unique_ptr (const unique_ptr &)' gelöscht. – xis