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)
{
}
En doute, vous pouvez toujours faire MyImprovedArray (MyImprovedArray &&) = par défaut; ' – Jarod42
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-à). –