2015-07-31 7 views
6

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) 
{ 
} 
+0

Im Zweifelsfall können Sie immer noch 'MyImprovedArray (MyImprovedArray &&) = default;' – Jarod42

+0

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-). –

Antwort

5

Rule of five (oder Null) gilt für die abgeleitete Klasse, und zwar unabhängig davon, was die Basisklasse definiert.

Wenn Ihr move - Konstruktor MyImprovedArray nichts Besonderes macht, definieren Sie ihn nicht und lassen Sie den Compiler einen erzeugen.

+0

Also ich bin klar, das bedeutet, ich brauche nichts in 'MyImprovedArray' zu schreiben? Das heißt, die Deklaration und ': MyArray (std :: move (t))' (und der leere Körper) sind falsch? (Tut mir leid zu fragen. In C++ wurde ich ein paar Mal mit dem * gebissen "zahle nicht dafür, wenn du es nicht brauchst" * Mantra. Es endete schlecht mit virtuellen Destruktoren). – jww

+3

Korrekt (abgesehen von einem Konstruktor offensichtlich). Wenn Sie keinen Destruktor definieren, den Konstruktor verschieben, den Konstruktor kopieren, den Zuweisungsoperator verschieben oder den Zuweisungsoperator kopieren, erstellt der Compiler sie für Sie (vorausgesetzt, die Klasse ist basierend auf ihren Mitgliedern kopierbar/beweglich). – CoryKramer

Verwandte Themen