in questo esempio si può citare solo lo standard:
12.2 oggetti temporanei [class.temporary]
oggetti temporanei vengono distrutti come ultimo passaggio nella valutazione pieno-espressione (1.9) che (lessicalmente) contenere s il punto in cui sono stati creati. Questo è vero anche se la valutazione termina con il lancio di un'eccezione. I calcoli del valore e gli effetti collaterali della distruzione di un oggetto temporaneo sono associati solo all'espressione completa, non a una sottoespressione specifica.
cioè dopo il punto e virgola della vostra linea:
const char * s = (s1+s2).c_str(); // <- Here
Così qui:
printf("%s\n",s); // This line will now cause undefined behaviour.
Perché? Perché, come l'oggetto è destructed, non si sa più quello che è in questo luogo ora ...
La cosa brutta è che, con un comportamento indefinito , il programma può sembrare a lavorare per la prima volta, ma ... si andrà in crash con certezza nel momento peggiore ...
si può fare:
printf("%s\n", (s1+s2).c_str());
che funzionerà perché l'oggetto non viene distrutto ancora (ricordate, dopo il punto e virgola ...).
fonte
2013-08-09 12:16:57
Inserire 'string s3 (" Oh no! ");' Appena prima della stampa, è probabile che l'output cambierà. (Ma non è garantito.) – Mat
Il "possibile duplicato" è fondamentalmente diverso (utilizzare all'interno della stessa espressione completa) – MSalters