Ich beendete das Lesen Thomas Becker's "C++ Rvalue References". Ich habe ein paar Fragen zu Rvalues und Rvalue Referenzen.Müssen abgeleitete Klassen die Bewegungssemantik implementieren, wenn eine Basis sie bereitstellt?
Angenommen, ich habe ein einfaches Array-Klasse:
template <class T>
MyArray
{
...
T* m_ptr; // Pointer to elements
size_t m_count; // Count of elements
};
Ferner nehme an, es bietet:
#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
Angenommen nun, ich habe eine abgeleitete Klasse, die nicht neue Datenelemente hinzu:
MyImprovedArray : public MyArray
{
...
};
Was vonerforderlich ist?
Benötigt es auch eine MyImprovedArray(MyImprovedArray&&)
und MyImprovedArray& operator=(MyImprovedArray&&)
? Wenn ja, muss nur die Basisklasse std::move
ausgeführt werden? Oder muss es auch die std::swap
durchführen?
MyImprovedArray(MyImprovedArray&& t)
: MyArray(t)
{
}
Im Zweifelsfall können Sie immer noch 'MyImprovedArray (MyImprovedArray &&) = default;' – Jarod42
Solange Sie keine virtuelle Basis haben, sind die Standardwerte in Ordnung. Wenn Sie eine virtuelle Basis haben, [müssen Sie möglicherweise Ihre Kopier-/Verschiebebeauftragungsoperatoren prüfen] (http://stackoverflow.com/questions/17252869/danger-with-virtual-base-move-assignment-operators- wann-sie-sind-jetzt-erlaubt-). –