¿Por qué esto necesita un std :: move explícito?

Digamos que tengo unFoo clase que contiene unstd::vector construido a partir destd::unique_ptr objetos de otra clase,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);
}

Esto da lugar a un error de compilación (en g ++ 4.8.1) que dice que el constructor de copia destd::unique_ptr Se elimina, lo cual es razonable. La pregunta aquí es que, dado que el argumento de barra ya es una referencia de valor, ¿por qué el constructor de copia destd::unique_ptr Se llama en lugar de su constructor de movimientos?

Si llamo explícitamentestd::move enFoo::AddBar luego el problema de la compilación desaparece, pero no entiendo por qué es necesario. Creo que es bastante redundante.

Entonces, ¿qué me estoy perdiendo?

Respuestas a la pregunta(4)

Su respuesta a la pregunta