Pour voir clairement ce qui se passe, je recommande inclure le this
pointeur dans la sortie pour identifier quel A appelle la méthode.
A() {cout<<"A (" << this << ") Construction" <<endl;}
A(A const& a){cout<<"A (" << &a << "->" << this << ") Copy Construction"<<endl;}
~A() {cout<<"A (" << this << ") Destruction" <<endl;}
La sortie est que j'ai
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0x100160->0x100170) Copy Construction
A (0xbffff8ce->0x100171) Copy Construction
A (0x100160) Destruction
A (0xbffff8ce) Destruction
A (0x100170) Destruction
A (0x100171) Destruction
Ainsi, le flux peut être interprété comme:
- Le temporaire (... cf) est créé.
- Le caractère temporaire A (... cf) est copié dans le vecteur (... 60).
- Le caractère temporaire A (... cf) est détruit.
- Un autre A (... ce) temporaire est créé.
- Le vecteur est étendu, et l'ancien A (... 60) dans ce vecteur est copié dans le nouvel endroit (... 70)
- L'autre temporaire A (... Ce) est copié dans le vecteur (... 71).
- Toutes les copies inutiles de A (... 60, ... ce) sont maintenant détruites.
- Le vecteur est détruit, donc les A (... 70, ... 71) à l'intérieur sont également détruits.
Étape 5 sera allé si vous
vector<A> t;
t.reserve(2); // <-- reserve space for 2 items.
t.push_back(A());
t.push_back(A());
La sortie deviendra:
A (0xbffff8cf) Construction
A (0xbffff8cf->0x100160) Copy Construction
A (0xbffff8cf) Destruction
A (0xbffff8ce) Construction
A (0xbffff8ce->0x100161) Copy Construction
A (0xbffff8ce) Destruction
A (0x100160) Destruction
A (0x100161) Destruction
@KennyTM: excellente méthode et une explication! Merci! – Lazer