Warum wird der Destruktor eines verschobenen from-Objekts aufgerufen?

8

Betrachten Sie den folgenden Code:

%Vor%

LIVE-DEMO

In dem gezeigten Code:

  1. Der Standardkonstruktor der Klasse foo wird für die Konstruktion des Objekts tmp .
  2. aufgerufen
  3. Der Move-Konstruktor der Klasse foo wird in der Anweisung v.push_back(std::move(tmp)); .
  4. aufgerufen
  5. Der Destruktor von class foo wird zweimal aufgerufen.

Fragen:

  1. Warum wird der Destruktor eines verschobenen Objekts zweimal aufgerufen?
  2. Was bewegt sich wirklich von dem Objekt, das bewegt wird?
101010 05.07.2014, 01:43
quelle

1 Antwort

2
  

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>     

T.C. 05.07.2014, 01:49
quelle

Tags und Links