2015-05-11 18 views
5

Capisco che ogni volta che un costruttore di copie personalizzato o un operatore di assegnazione viene definito in una classe derivata, è responsabilità di tali metodi chiamare i rispettivi metodi della classe base. Ora il mio focus è sui costruttori di movimento. Supponiamo che quanto segue sia il mio costruttore di movimento. Ho due modi per chiamare il costruttore della classe base. Tratto da hereDovremmo chiamare i costruttori di copia/assegnazione di movimento classe base dalla classe derivata

Derived(Derived&& d):Base(d) -->Form A 
{} 
Derived(Derived&& d):Base(std::move(d)) -->Form B 
{} 

Ora quale metodo è corretto. Dalla mia comprensione e dall'ultima risposta sul post che utilizza il modulo B sarebbe pericoloso e scorretto in quanto l'oggetto verrà annullato quando viene chiamato il costruttore della classe derivata. Tuttavia, nella formaA viene chiamato il costruttore della copia della classe base. Sarebbe meglio chiamare FormA. Allo stesso modo nello spostamento l'operatore di assegnazione delle copie non sarebbe meglio chiamare l'operatore di assegnazione della classe base quindi la classe base.

risposta

3

Form A non è corretto. Non implementa la semantica del movimento. Per quanto riguarda la versione Form B, la frase che "d è annullata da Base(std::move(d))" è imprecisa. L'affermazione corretta dovrebbe essere "la parte Base (subobject) di d è annullata".

Inoltre, suggerisco di trasmettere esplicitamente d al tipo di base prima di richiamare il costruttore di base. Cioè, Base(std::move(static_cast<Base&>(d))). Questo evita potenziali problemi se Base ha un costruttore di template. Ad esempio, si consideri il caso in cui Base è std::function. Senza il cast esplicito, si avrà una ricorsione infinita a causa di constructor (5) di std::function.

+2

È un po 'ridondante usare 'std :: move' se si intende usare' static_cast'. Solo 'Base (std :: static_cast (d))' sta bene. –

+0

@SiyuanRen L'intenzione sembra più chiara con 'static_cast' quindi' move'. – Lingxi

Problemi correlati