2011-03-28 5 views
10

Eventuali duplicati:
C++: Life span of temporary arguments?confini Full-espressione e la vita di provvisori

Si dice che le variabili temporanee vengono distrutte come ultimo passo nella valutazione del full-espressione, per esempio

bar(foo().c_str()); 

puntatore temporanea vive fino al ritorno a barre, ma quello che per la

baz(bar(foo().c_str())); 

è ancora vive fino al ritorno a barre, o il ritorno baz significa end full-espressione qui, compilatori ho controllato gli oggetti autodistruzione dopo baz ritorna, ma posso fidarmi di quello?

+0

sì, la risposta a questa domanda dovrebbe essere una parte di http://stackoverflow.com/questions/4214153/lifetime-of-temporaries, ne ho richiesto uno nuovo perché non ho i diritti per postare commenti lì ed ero interessato a un dettaglio specifico che non è coperto lì. – Vasaka

risposta

10

Vita temporanea fino alla fine dell'espressione completa in cui sono stati creati. Una "espressione completa" è un'espressione che non è una sottoespressione di un'altra espressione.

In baz(bar(...));, bar(...) è una sottoespressione di baz(...), mentre baz(...) non è una sottoespressione di nulla. Pertanto, baz(...) è l'espressione completa e tutti i provvisori creati durante la valutazione di questa espressione non verranno eliminati finché non sarà restituito baz(...).

+2

Si noti, tuttavia, che i costruttori sono un caso speciale (credo - sicuro al 90%), quindi in 'baz (X (foo(). C_str()));', dove 'X' è una classe e l'argomento to 'baz' è una chiamata al costruttore' X', la durata del 'c_string' finirà quando il costruttore si chiude. –

3

Come suggerisce il nome, l'espressione completa è tutta l'espressione, compresa la chiamata a baz(), quindi il temporaneo resterà in attesa finché non verrà restituita la chiamata a baz().