Dlaczego wymaga to wyraźnego std :: move?
Powiedzmy, że mamFoo
klasa zawierającastd::vector
zbudowany zstd::unique_ptr
obiekty innej klasy,Bar
.
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);
}
To powoduje błąd kompilacji (w g ++ 4.8.1) mówiąc, że konstruktor kopiistd::unique_ptr
jest usuwany, co jest uzasadnione. Pytanie tutaj brzmi, ponieważ argument bar jest już referencją rvalue, dlaczego konstruktor kopiowaniastd::unique_ptr
jest wywoływany zamiast konstruktora ruchu?
Jeśli wyraźnie zadzwonięstd::move
wFoo::AddBar
potem problem z kompilacją zniknie, ale nie rozumiem, dlaczego jest to potrzebne. Myślę, że to dość zbędne.
Więc czego mi brakuje?