Ich verstehe, dass, wenn ein benutzerdefinierter Kopie Konstruktor oder ein Zuweisungsoperator in einer abgeleiteten Klasse definiert ist, dann ist es die Verantwortung dieser Methoden, die entsprechenden Methoden aufzurufen der Basisklasse. Jetzt konzentriere ich mich auf die Move-Konstruktoren. Angenommen, der folgende Code ist mein Move-Konstruktor. Ich habe zwei Möglichkeiten, den Basisklassenkonstruktor aufzurufen. Entnommen hereSollten wir die Basisklasse kopieren Kopieren/Zuweisung Konstruktoren aus der abgeleiteten Klasse
Derived(Derived&& d):Base(d) -->Form A
{}
Derived(Derived&& d):Base(std::move(d)) -->Form B
{}
Nun, das Verfahren korrekt ist. Aus meinem Verständnis und aus der letzten Antwort auf den Post mit Form B wäre gefährlich und inkorrekt, da das Objekt ungültig wird, wenn der abgeleitete Klassenkonstruktor aufgerufen wird. In formA wird jedoch der Kopierkonstruktor der Basisklasse aufgerufen. Wäre es besser, FormA anzurufen. Ähnlich wäre es im Zuweisungsoperator für Verschiebekopien nicht besser, den Basisklassenzuweisungsoperator als die Basisklasse aufzurufen.
Es ist ein wenig überflüssig, 'std :: move' zu verwenden, wenn Sie' static_cast' verwenden wollen. Just 'Base (std :: static_cast (d))' ist in Ordnung. –
@SiyuanRen Die Absicht erscheint klarer mit 'static_cast' dann' move'. – Lingxi