2015-07-31 4 views
6

J'ai fini de lire Thomas Becker's "C++ Rvalue References". J'ai quelques questions sur les références Rvalues ​​et Rvalue.Les classes dérivées doivent-elles implémenter la sémantique de déplacement lorsqu'une base la fournit?

Supposons que j'ai une simple classe de tableau:

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

En outre supposons qu'il fournit:

#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 

Maintenant, supposons que j'ai une classe dérivée cela ne pas ajouter de nouveaux membres de données:

MyImprovedArray : public MyArray 
{ 
    ... 
}; 

Qu'est-ce qui est requis de MyImprovedArray? Est-il besoin d'un MyImprovedArray(MyImprovedArray&&) et MyImprovedArray& operator=(MyImprovedArray&&) également? Si oui, a-t-il seulement besoin d'exécuter la classe de base std::move? Ou faut-il aussi effectuer le std::swap?

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

En doute, vous pouvez toujours faire MyImprovedArray (MyImprovedArray &&) = par défaut; ' – Jarod42

+0

Tant que vous n'avez pas de base virtuelle, les valeurs par défaut sont bien. Si vous avez une base virtuelle, [vous devrez peut-être jeter un coup d'œil à vos opérateurs d'affectation de copie/déplacement] (http://stackoverflow.com/questions/17252869/danger-with-virtual-base-move-assignment-operators- quand-ils-sont-maintenant-autorisés-à). –

Répondre

5

Rule of five (ou zéro) applique à la classe dérivée, quelle que soit la classe de base définit. Si le constructeur de déplacement de votre MyImprovedArray ne fait rien de spécial, ne le définissez pas et laissez le compilateur en générer un.

+0

Donc, je suis clair, cela signifie que je n'ai pas besoin d'écrire quoi que ce soit dans 'MyImprovedArray'? Autrement dit, la déclaration et ': MyArray (std :: move (t))' (et le corps vide) sont faux? (Désolé de demander.) En C++, j'ai été mordu à quelques reprises avec le * "mantra ne payez pas quand vous n'en avez pas besoin" * mantra.Il a fini mal avec des destructeurs virtuels). – jww

+3

Correct (à part un constructeur évidemment). Si vous ne définissez pas un destructeur, un constructeur de déplacement, un constructeur de copie, un opérateur d'assignation de déplacement ou un opérateur d'assignation de copie, le compilateur les créera pour vous (en supposant que la classe est copiable/mobile selon ses membres) – CoryKramer