2015-05-11 5 views
5

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.

Antwort

3

Form A ist falsch. Es implementiert die Umzugs-Semantik nicht. In Bezug auf die Version Form B ist die Aussage, dass "d durch Base(std::move(d)) annulliert ist" ungenau. Die genaue Aussage sollte lauten: "Der Base Teil (Unterobjekt) d wird annulliert".

Außerdem, ich schlage vor, Sie explizit d auf den Basistyp vor dem Aufruf des Basiskonstruktors zu werfen. Das heißt Base(std::move(static_cast<Base&>(d))). Dies vermeidet mögliche Probleme, wenn Base einen Template-Konstruktor hat. Betrachten Sie zum Beispiel den Fall, wenn Basestd::function ist. Ohne die explizite Umwandlung werden Sie aufgrund von constructor (5) von std::function mit unendlicher Rekursion enden.

+2

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. –

+0

@SiyuanRen Die Absicht erscheint klarer mit 'static_cast' dann' move'. – Lingxi

Verwandte Themen