Definiert der Standard genau, was ich mit einem Objekt tun kann, wenn es verschoben wurde? Früher dachte ich, dass alles, was Sie mit einem verschobenen Objekt tun können, darin besteht, es zu zerstören, aber das würde nicht ausreichen.
Nehmen Sie zum Beispiel die Funktionsvorlage, swap
wie sie in der Standardbibliothek definiert ist:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Offensichtlich muss es möglich sein, verschobenen Objekten zuzuweisen, da sonst die Zeilen 2 und 3 fehlschlagen würden. Was kann ich sonst noch mit verschobenen Objekten tun? Wo genau finde ich diese Angaben im Standard?
(Übrigens, warum ist es T c = std::move(a);
statt T c(std::move(a));
in Zeile 1?)
quelle
pop_back
einer eingefahrenen ausvector
. Aber Sie können sicher herausfinden, ob es istempty()
.pop_back
Von einem leerenvector
hat sowieso undefiniertes Verhalten, aus dem Speicher, also bin ich mir ziemlich sicher, dasspop_back
von einem bewegten Vektor, der undefiniertes Verhalten zeigt, konsistent ist.pop_back
verhält sich also immer noch wie bei jedem gültigen Vektor (kann es sogar ein leerer Vektor sein).17.6.5.15 [lib.types.movedfrom]
Wenn sich ein Objekt in einem nicht angegebenen Zustand befindet, können Sie jede Operation an dem Objekt ausführen, für die keine Voraussetzungen vorliegen. Wenn es eine Operation mit Vorbedingungen gibt, die Sie ausführen möchten, können Sie diese Operation nicht direkt ausführen, da Sie nicht wissen, ob der nicht angegebene Status des Objekts die Voraussetzungen erfüllt.
Beispiele für Operationen, die im Allgemeinen keine Voraussetzungen haben:
get
,empty
,size
Beispiele für Operationen, die im Allgemeinen Voraussetzungen haben:
Diese Antwort wird jetzt im Videoformat hier angezeigt: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
quelle
char* buffer;
und mitint length;
Mitgliedern habe, muss mein Verschiebungskonstruktor / meine Zuweisungszuweisung den Wert von beiden austauschen (oder festlegen)? Oder wäre es in Ordnung sein, wenn die Länge nicht näher bezeichnet wurde (was bedeutet , dassempty
undsize
sinnlose Werte zurück)?