Cuando tiene un objeto derivado con un constructor de movimiento, y el objeto base también tiene semántica de movimiento, ¿cuál es la forma correcta de llamar al constructor de movimiento de objeto base desde el constructor de movimiento de objeto derivado?Mover constructor en objeto derivado
probé la primera cosa más obvia:
Derived(Derived&& rval) : Base(rval)
{ }
Sin embargo, esto parece acabar llamando a copia constructor del objeto Base. Luego probé explícitamente mediante std::move
aquí, así:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
Esto funcionó, pero estoy confundido por qué es necesario. Pensé que std::move
simplemente devuelve una referencia rvalue. Pero dado que en este ejemplo rval
ya es una referencia rvalue, la llamada a std::move
debería ser superflua. Pero si no uso std::move
aquí, simplemente llama al constructor de copia. Entonces, ¿por qué es necesaria la llamada al std::move
?
Solo para agregar una nota independientemente del constructor de movimiento si proporciona una entrada de argumento como lvalue regular (no utiliza std :: move (xx)) obtendrá "no se puede unir" Xyy 'lvalue a' Xyy && 'para una función definido como foo (Xyy && xyy). –