Betrachten Sie den folgenden Code:
%Vor%In dem gezeigten Code:
foo
wird für die Konstruktion des Objekts tmp
. foo
wird in der Anweisung v.push_back(std::move(tmp));
. class foo
wird zweimal aufgerufen. Fragen:
Warum wird der Destruktor eines verschobenen Objekts zweimal aufgerufen?
Der erste Destruktor zerstört das verschobene from tmp
, wenn es am ersten }
in main()
aus dem Geltungsbereich verschwindet. Der zweite Destruktor zerstört die move-errichtete foo
, die Sie push_back
'in v
am Ende von main()
haben, wenn v
den Gültigkeitsbereich verlässt.
Was bewegt sich wirklich von dem Objekt, das bewegt wird?
Der vom Compiler generierte Move-Konstruktor move-konstruiert id
, was ein std::string
ist. Ein Move-Konstruktor von std::string
übernimmt in der Regel den Besitz des Speicherblocks in dem verschobenen Objekt, das die tatsächliche Zeichenfolge speichert, und setzt das verschobene Objekt in einen gültigen, jedoch nicht spezifizierten Zustand (in der Praxis wahrscheinlich eine leere Zeichenfolge) / p>