Schauen wir uns einige triviale aussehen bewegen-konstruierbar und (nicht triviale) copy-konstruierbar (aber immer noch Copy- konstruierbar) benutzerdefinierte (Klasse) Typ A
:Unterscheidet sich das einfache Kopieren und Verschieben?
struct A
{
A() = default;
A(A const &) {}
A(A &&) = default;
};
Dann A
bewegen (move-Konstruktion oder move-assignment) führt buchstäblich folgendes durch: Eine Quelle bitweise kopierte an ein Ziel, trotz des Namens der Operation "moving". Während trivial bewegende rechte Seite ist (formal) nicht const
, aber Trivialität der ganzen Operation erfordert (tatsächliche) Nicht-Veränderlichkeit der rechten Seite, nicht wahr? In meinen Augen bedeutet dies, dass triviale Kopieroperationen und triviale Verschiebeoperationen in ihrer tiefen Natur (in Bezug auf Speicher, Speicherlayout, Bits usw.) genau gleich sind. Habe ich recht?
Wenn es so ist, dann denke ich, wenn ich trivial move-constructible, aber nicht trivial Copy-Constructible geben Benutzercode ein, dann sehe ich offensichtlich einige Antipattern. Habe ich recht?
Gibt es ein Beispiel für einen solchen künstlichen aber verwendbaren Typ, der nicht trivial kopierbar/zuweisbar ist, sondern trivial move-constructible/assignable?
"* In meinen Augen bedeutet dies, dass triviale Kopieroperation und triviale Bewegungsoperation in ihrer tiefen Natur (bezüglich Speicher, Speicherlayout, Bits usw.) genau gleich sind. Habe ich recht? *" Ja . – ildjarn
Äh, diese Frage ist überhaupt nicht mit dieser Frage verbunden. – Barry
Fall "Edge": Ein Typ, der nicht copy-constructible ist, kann trivial move-constructible und nicht trivial copy-constructible sein (ein Konstruktor für gelöschte Kopien ist (offensichtlich) nicht trivial). – Holt