È questo equivalente a questo
Sì. Ma è valido solo per le classi che non hanno membri non mobili.Guarda questo esempio:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) = default;
nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "copy" << std::endl; }
movable( movable &&) { std::cerr << "move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c)); // prints copy
}
Esso stampa:
copy
http://coliru.stacked-crooked.com/a/62c0a0aaec15b0eb
Quindi, se una classe ha anche un solo membro non mobile, il costruttore mossa esplicitamente inadempiente utilizzerà i costruttori di copia per tutti i membri, anche per quelli che hanno il costruttore di mosse.
Tuttavia, non è necessario che i membri abbiano costruttori di movimento definiti in modo esplicito o predefinito in modo esplicito. Se il costruttore di movimento non è dichiarato, il costruttore di movimento verrà utilizzato per i membri che hanno il costruttore di movimento e il costruttore di copia verrà utilizzato per i membri che non definiscono il costruttore di spostamenti. Vedere l'esempio:
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable &) { std::cerr << "nonmovable::copy" << std::endl; }
//nonmovable( nonmovable &&) = delete;
};
struct movable
{
movable() = default;
movable(const movable &) { std::cerr << "movable::copy" << std::endl; }
movable( movable &&) { std::cerr << "movable::move" << std::endl; }
};
struct has_nonmovable
{
movable a;
nonmovable b;
has_nonmovable() = default;
has_nonmovable(const has_nonmovable &) = default;
has_nonmovable( has_nonmovable &&) = default;
};
int main()
{
has_nonmovable c;
has_nonmovable d(std::move(c));
}
Esso stampa:
movable::move
nonmovable::copy
http://coliru.stacked-crooked.com/a/fda51f29a4b92881
Ci sono classi che sono mobili ma non copiabile (ad esempio unique_ptr
). Esistono classi che possono essere copiate e utilizzare il costruttore di copia per lo spostamento. Ma non conosco alcun motivo per creare una classe che è possibile copiare ma che ha esplicitamente eliminato il costruttore di mosse.
fonte
2018-02-26 11:38:17
Questa potrebbe essere una duplicazione di http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor –
@ DieterLücking: chiaramente non è, anche se è su un argomento simile e alcuni le risposte possono coprire un terreno simile. Tuttavia, non chiudiamo ogni singola domanda sulla semantica del movimento come duplicati l'uno dell'altro. –
Nota, ho aggiunto la mia risposta a questa domanda perché al momento cercavo una citazione dallo standard che dimostrasse che erano equivalenti e la risposta accettata non lo fa. Quindi, ho appena trovato la citazione e ho aggiunto la mia risposta. –