¿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?