Il costruttore di spostamento predefinito e l'allineamento del movimento generato dal compilatore chiameranno il costruttore/assegno di spostamento per ciascun membro della classe.
Se la classe ha solo membri non elaborati, "char * buffer", ad esempio, è necessario scrivere le proprie operazioni di spostamento.
Se la classe ha solo "membri gestiti", "vettore", ad esempio, le operazioni di spostamento predefinite per la classe saranno ok perché delegano l'operazione a ciascun membro.
Se la classe è "gestito membri" mescolato con "membri prime", il vettore e int * ad esempio, le operazioni di movimentazione dovranno fare la mossa manuale delle risorse prime e chiamare operazioni di spostamento per gli oggetti gestiti:
class MyObject {
public:
// ...
MyObject(MyObject&& other) : vector1(std::move(other.vector1)) {
// We use vector's move constructor^
// and then move ourself the char* buffer
buffer1 = other.buffer1;
other.buffer1 = nullptr;
}
MyObject& operator=(MyObject&& other) {
// We use vector's move asignment operator
vector1= std::move(other.vector1);
// and then move ourself the char* buffer
std::swap(buffer1,other.buffer1);
return *this;
}
//...
private:
vector<char> vector1;
char * buffer1;
};
std :: move (other.vector1) è necessario perché all'interno di quella funzione other.vector1 è un lvalue. Dobbiamo dire al compilatore che non utilizzeremo il valore vector1 più avanti nel codice funzione in modo che il suo valore possa essere spostato.
Si dovrebbe comunque avere un costruttore di movimento, dal momento che 'std :: vector' può trarre vantaggio dallo spostamento. Lo schema generato dal compilatore (spostamento membro) dovrebbe essere abbastanza buono. –
Credo si chiami * Copy Constructor *, non * Move Constructor *. –
@AlexFarber: il costruttore di copie predefinito è abbastanza buono se non ci sono puntatori membri (come menzionato sopra da T.C.). –