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?

questionAnswers(4)

yourAnswerToTheQuestion