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)
{
}
In dubbio, si può ancora fare 'MyImprovedArray (MyImprovedArray &&) = default;' – Jarod42
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). –