Si consideri il seguente frammento di codice:Perché viene invocato il distruttore di un oggetto spostato dall'oggetto?
struct foo {
std::string id;
};
int main() {
std::vector<foo> v;
{
foo tmp;
v.push_back(std::move(tmp));
}
}
Nel pezzo di codice dimostrato:
- Il costruttore di default della classe
foo
sta per essere richiamato per la costruzione di oggettitmp
. - Il costruttore di movimento della classe
foo
sta per essere richiamato nella dichiarazionev.push_back(std::move(tmp));
. - Il distruttore di
class foo
verrà invocato due volte.
Domande:
- Perché il distruttore di un oggetto spostato dalla viene chiamato due volte?
- Cosa viene spostato dall'oggetto che viene effettivamente spostato?
L'oggetto spostato da è solo destrutturato una volta. Ogni oggetto viene creato una volta e distrutto una volta. Le due chiamate del distruttore sono per 'tmp' e l'oggetto nel vettore. –