2012-02-06 14 views
16

InQuesto riferimento temporaneo sopravvive abbastanza a lungo?

template <typename T> 
T const & foo(T const & dflt) 
    { return /* ... */ ? /* ... */ : dflt; } 

int x = foo(5); 

Condivide la riferimento alla temporanea "sopravvivere" fino a quando è assegnato a x?

(lo so che sopravvive alla durata della chiamata foo(), ma l'assegnazione mi fa esitare)

Il codice in questione ha alcuni usi legittimi per fare affidamento su riferimenti const qui, vale a dire che avrei avuto bisogno di due separati funzioni

T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

che voglio evitare (solo basandosi su diverse firme wiht lo stesso nome sembra un po 'rischioso per me.)

+0

Cosa significa '...? ...: dflt; 'questo dovrebbe significare? 0_o –

+1

'...' in questo contesto è "il codice che è irrilevante alla domanda.Io l'ho modificato in commenti, forse è più chiaro. – peterchen

risposta

14

fa il riferimento alla temporanea "sopravvivere" u ntil è assegnato a x?

In generale, sì. Se foo restituisce dflt, tale riferimento (a un 5 temporaneo) è valido fino alla fine dell'espressione completa in cui è stato creato, ovvero fino a dopo l'inizializzazione.

C++ 03, 12,2/3:

Quando un'implementazione introduce un oggetto temporaneo di una classe che ha un costruttore non banale (12.1), si deve assicurare che un costruttore si chiama per l'oggetto temporaneo. Allo stesso modo, il distruttore deve essere chiamato temporaneamente con un distruttore non banale (12.4). Gli oggetti temporanei vengono distrutti come ultimo passaggio in valutando l'espressione completa (1.9) che (lessicalmente) contiene il punto in cui sono stati creati. Questo è vero anche se la valutazione termina con il lancio di un'eccezione.

Altro è disponibile in 12.2/4 e 12.2/5, in particolare le eccezioni di questa regola.

Non riesco a vedere cosa succede quando restituisce lo ... che hai lasciato fuori, ma immagino che non stavi chiedendo questo.

+7

Attualmente non è specificato che il negozio su" x "sia parte del completo Vedere http://llvm.org/bugs/show_bug.cgi?id=9783, tuttavia fortemente voluto sia dal comitato che dagli (auspicabilmente) utenti, ma indipendentemente da ciò, è già specificato dalle specifiche che * leggono * del riferimento restituito da 'foo' (lvalue-to-rvalue) fa parte dell'espressione completa Vedi 1.9p10 e il suo esempio finale –

+0

Grazie per la risposta rapida! Sì, il ... caso è sicuro - Io solo escluso (riferimento a un elemento di una raccolta passato per riferimento come parametro aggiuntivo) – peterchen

Problemi correlati