Questo è perfettamente definito e ben educati. Tutti gli oggetti secondari completamente costruiti vengono distrutti se l'inizializzazione di un oggetto termina con un'eccezione, in ordine inverso rispetto alla loro costruzione. Questo è lo stesso per gli array come per gli oggetti di tipo definito dall'utente (si pensi alle classi e ai membri della classe).
Formalmente, abbiamo C++ 11 15,2/2:
Un oggetto di qualsiasi durata di conservazione di cui inizializzazione o distruzione viene terminato da un'eccezione avrà avere distruttori eseguite per tutti gli oggetti secondari completamente costruite (esclusi i membri variante di una classe union-like), cioè per oggetti secondari per i quali il costruttore principale (12.6.2) ha completato l'esecuzione e il distruttore non è ancora iniziato l'esecuzione.
fonte
2013-10-29 12:26:02
+1 Ebbene sì, grazie signore! L'ordine * di distruzione non specificato e lasciato all'implementazione? (L'ordine [in questo esempio] (http://ideone.com/BHZWo4) è interessante per me. – WhozCraig
@WhozCraig: No, l'ordine deve essere specificato (pensa a cose più recenti che si riferiscono a cose più vecchie) Fammi vedere se riesco a trovare una dichiarazione formale –
Ok. Grazie. Non riesco a vederlo * non * specificato * da qualche parte * È di grande dettaglio per gli oggetti automatici in-scope o membri di qualche oggetto, quindi lo penserei anche qui. – WhozCraig