Domyślny konstruktor ruchu i przeniesienie przypisania wygenerowane przez kompilator wywoła konstruktor ruchu/przypisanie dla każdego elementu klasy.
Jeśli twoja klasa ma tylko surowe elementy, na przykład "bufor char *", musisz napisać własne operacje przenoszenia.
Jeśli twoja klasa ma tylko "członków zarządzanych", na przykład "wektor", domyślne operacje przeniesienia dla twojej klasy będą ok, ponieważ deleguje operację do każdego członka.
Jeśli klasa „udało członków” mieszane z „surowych członków”, wektor i int * Na przykład, operacje przewozowe będą musiały zrobić ręczny ruch surowych środków i wywołać operacje ruch dla zarządzanych obiektów:
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) jest potrzebny ponieważ wewnątrz że funkcja other.vector1 jest lwartością. Musimy powiedzieć kompilatorowi, że nie użyjemy wartości wektora1 później w kodzie funkcji, aby można było przenieść jej wartość.
Powinieneś nadal mieć konstruktor ruchu, ponieważ 'std :: vector' może czerpać korzyści z przenoszenia. Wygenerowany przez kompilator (przesunięcie w prawo) powinien być wystarczająco dobry. –
Wierzę, że to się nazywa * Kopiuj Konstruktor *, a nie * Przenieś Konstruktora *. –
@AlexFarber: Domyślny konstruktor kopii jest wystarczająco dobry, jeśli nie ma żadnych wskaźników członków (jak wspomniano powyżej przez T.C.). –