Wenn Sie ein abgeleitetes Objekt mit einem Verschiebungskonstruktor haben und das Basisobjekt auch Verschiebungssemantik hat, wie kann der Verschiebungskonstruktor des Basisobjekts aus dem Konstruktor des abgeleiteten Objekts move aufgerufen werden?Konstruktor auf abgeleitetem Objekt verschieben
Ich habe versucht, die naheliegendste Sache zuerst:
Derived(Derived&& rval) : Base(rval)
{ }
jedoch diese Copykonstruktor des Basisobjekts aufrufen, um am Ende zu sein scheint. Dann habe ich versucht ausdrücklich std::move
hier verwendet wird, wie folgt aus:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
Das funktionierte, aber ich bin verwirrt, warum es notwendig ist. Ich dachte, std::move
gibt nur eine R-Wert-Referenz. Aber da in diesem Beispiel rval
bereits eine rvalue-Referenz ist, sollte der Aufruf an std::move
überflüssig sein. Aber wenn ich std::move
hier nicht verwende, ruft es nur den Kopierkonstruktor auf. Warum ist der Anruf an std::move
notwendig?
Nur um eine Notiz unabhängig von move -Konstruktor hinzuzufügen, wenn Sie eine Argumenteingabe als reguläres lvalue (ohne die Verwendung von std :: move (xx)) zur Verfügung stellen, können Sie 'Xyy' lvalue an 'Xyy &&' für eine Funktion binden Definiert als foo (Xyy && xyy). –