2015-07-31 13 views
6

Ho finito di leggere Thomas Becker's "C++ Rvalue References". Ho un paio di domande sui riferimenti Rvalue e Rvalue.Le classi derivate devono implementare la semantica del movimento quando viene fornita da una base?

Supponiamo che io sono una semplice classe array:

template <class T> 
MyArray 
{ 
    ... 
    T* m_ptr; // Pointer to elements 
    size_t m_count; // Count of elements 
}; 

Inoltre supponiamo che prevede:

#if(__cplusplus >= 201103L) 
MyArray(MyArray&& t) 
    : m_ptr(std::move(t.m_ptr)), m_count(std::move(t.m_count)) 
{ 
    t.m_ptr = NULL; 
    t.m_count = 0; 
} 
MyArray operator=(MyArray&& t) 
{ 
    std::swap(*this, t); 
    return *this; 
} 
#endif 

Ora, supponiamo di avere una classe derivata che fa non aggiungere nuovi membri di dati:

MyImprovedArray : public MyArray 
{ 
    ... 
}; 

Che cosa è richiesto di MyImprovedArray?

Ha bisogno anche di un MyImprovedArray(MyImprovedArray&&) e di MyImprovedArray& operator=(MyImprovedArray&&)? In tal caso, è sufficiente eseguire la classe base std::move? O è necessario eseguire anche lo std::swap?

MyImprovedArray(MyImprovedArray&& t) 
    : MyArray(t) 
{ 
} 
+0

In dubbio, si può ancora fare 'MyImprovedArray (MyImprovedArray &&) = default;' – Jarod42

+0

Finché non si dispone di una base virtuale, i valori di default sono a posto. Se hai una base virtuale, [potresti dover dare un'occhiata agli operatori di copia/spostamento degli incarichi] (http://stackoverflow.com/questions/17252869/danger-with-virtual-base-move-assignment-operators- quando-si-sono-ora-permesso-a). –

risposta

5

Rule of five (o zero) si applica alla classe derivata, indipendentemente da ciò che la classe base definisce.

Se il costruttore di movimento derivato MyImprovedArray non sta per fare qualcosa di speciale, non definirlo e lasciare che il compilatore ne generi uno.

+0

Quindi sono chiaro, ciò significa che non ho bisogno di scrivere nulla in 'MyImprovedArray'? Cioè, la dichiarazione e ': MyArray (std :: move (t))' (e il corpo vuoto) sono spuri? (Mi spiace di chiederlo. In C++ sono stato morso alcune volte con il mantra * "non pagare per quando non ne hai bisogno" *. È finito male con i distruttori virtuali). – jww

+3

Corretto (a parte ovviamente un costruttore). Se non si definisce un distruttore, si sposta costruttore, si copia costruttore, si sposta operatore assegnazione o si copia l'operatore di assegnazione, quindi il compilatore li renderà disponibili (supponendo che la classe sia copiabile/mobile in base ai relativi membri) – CoryKramer