Ist das Äquivalent zu dieser
Ja. Aber es ist nur gültig für Klassen, die nicht bewegliche Mitglieder haben.Schauen Sie sich dieses Beispiel:
#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
}
Er druckt:
copy
http://coliru.stacked-crooked.com/a/62c0a0aaec15b0eb
Also, wenn eine Klasse auch nur ein einziges nicht-bewegliches Element hat, wird die explizit vorgegeben bewegen Konstruktor die Kopierkonstruktoren verwenden für alle Mitglieder, auch für diejenigen, die den Move-Konstruktor haben.
Mitglieder müssen jedoch Move-Konstruktoren nicht explizit definiert oder explizit defaultiert haben. Wenn der move-Konstruktor überhaupt nicht deklariert ist, wird der move -Konstruktor für Elemente verwendet, die den move-Konstruktor haben, und der copy-Konstruktor wird für members verwendet, die den move-Konstruktor nicht definieren. Siehe Beispiel:
#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));
}
Er druckt:
movable::move
nonmovable::copy
http://coliru.stacked-crooked.com/a/fda51f29a4b92881
Es Klassen sind, die beweglich sind, aber nicht kopierbar (z unique_ptr
). Es gibt Klassen, die kopierbar sind und den Kopierkonstruktor zum Verschieben verwenden. Aber ich kenne keinen Grund, eine Klasse zu erstellen, die kopierbar ist, aber explizit move constructor gelöscht hat.
Dies könnte eine Verdopplung von http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor –
@ DieterLücking: Es ist eindeutig nicht, obwohl es über ein ähnliches Thema und einige ist Antworten können sich auf ähnliche Gründe beziehen. Wir werden jedoch nicht jede einzelne Frage zur Bewegungssemantik als Duplikate voneinander schließen. –
Hinweis, ich habe meine Antwort auf diese Frage hinzugefügt, weil ich zu der Zeit nach einem Zitat aus dem Standard gesucht habe, das bewiesen hat, dass sie gleichwertig sind und die akzeptierte Antwort das nicht tut. Also, ich habe gerade das Zitat gefunden und meine Antwort hinzugefügt. –