Quando si dispone di un oggetto derivato con un costruttore di movimento e anche l'oggetto di base ha semantica di spostamento, qual è il modo corretto per chiamare il costruttore di spostamento dell'oggetto di base dal costruttore di movimento dell'oggetto derivato?Sposta il costruttore sull'oggetto derivato
ho provato la cosa più ovvia prima:
Derived(Derived&& rval) : Base(rval)
{ }
Tuttavia, questo sembra finire per chiamare copia costruttore dell'oggetto Base. Poi ho provato in modo esplicito utilizzando std::move
qui, in questo modo:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
Questo ha funzionato, ma io sono confuso perché è necessario. Ho pensato che std::move
restituisca semplicemente un riferimento di rvalue. Ma poiché in questo esempio rval
è già un riferimento di rvalue, la chiamata a std::move
dovrebbe essere superflua. Ma se non uso std::move
qui, chiama semplicemente il costruttore di copie. Quindi, perché è necessaria la chiamata a std::move
?
Solo per aggiungere una nota indipendentemente dal costruttore di mosse se si fornisce un argomento come lvalue regolare (non usando lo std :: move (xx)) si otterrà "impossibile associare 'Xyy' lvalue a 'Xyy &&' per una funzione definito come foo (Xyy && xyy). –