2013-06-28 16 views
6

La sezione 12.2.5 della norma dice:durata temporanea estensione

Una temporanea legata ad un parametro di riferimento in una chiamata di funzione (5.2.2) persiste fino al completamento della piena espressione che contiene la chiamata . Un limite temporaneo al valore restituito in una funzione restituisce l'istruzione (6.6.3) finché non si chiude la funzione. In tutti questi casi , i provvisori creati durante la valutazione dell'espressione inizializzando il riferimento, ad eccezione del temporaneo a cui è associato il riferimento , vengono distrutti alla fine dell'espressione completa in da cui sono stati creati e nel ordine inverso del completamento di loro costruzione.

Il codice cerco di capire è:

#include <iostream> 

const int& foo(const int& fooRef) 
{ 
    return fooRef; 
}          // #0 

int main (void) 
{ 
    const int& numberRef = foo(5);  // #1 
    std::cout << numberRef;   // #2 
    return 0; 
} 

On line #1 un oggetto temporaneo viene creato e tenuto a fooRef parametro di foo. fooRef viene distrutto sulla linea #0. Quindi pensavo che il temporaneo dovesse essere distrutto qui da quando l'estensione della vita non è transitiva.

Domande:

  1. Cosa until the function exits significa? Significa untill it finished executing?

  2. Perché ottengo un output 5. Esiste ancora un oggetto temporaneo sulla riga #2?

  3. Come posso interpretare la citazione standard per capire come funziona questo esempio?

Step-by-step atomico con riferimenti allo standard sarebbe molto apprezzato. Grazie!

P. S. Una risposta accettata here ha anche detto che il codice è broken e non ottengo, perché ottengo tale output del programma.

risposta

3

Cosa significa fino a quando la funzione non si chiude? Significa che fino a quando non è finito?

Sì.

Perché ottengo un'uscita 5. Esiste ancora un oggetto temporaneo sulla linea # 2?

Dereferenziare un riferimento che non sia vincolato a un oggetto vivente è comportamento indefinito, quindi si può ottenere 5 così come 42 così come qualsiasi altra cosa (compreso un crash). Semplicemente non si può avere alcuna aspettativa su un programma che ha un comportamento indefinito.

Come posso interpretare la citazione standard per capire come funziona questo esempio?

Più o meno come hai fatto already.The temporanea ottiene legato al parametro funzione di fooRef, che viene distrutto al ritorno dalla funzione. Dal momento che quel temporaneo è legato al valore restituito, quell'oggetto cessa di esistere quando la funzione ritorna. Più avanti, stai degnando un riferimento ciondolante, che ti dà UB.

1
  1. Significa fino alla parentesi di chiusura, ovvero }.

  2. Hai invocato UB, hai un riferimento ciondolante.

Provare la seguente modifica del codice e vedere cosa viene stampato. Probabilmente stamperà 6 perché quello è l'ultimo in pila. Oppure prova a passare un std::string invece, potresti avere un incidente.

int main (void) 
{ 
    const int& numberRef = foo(5); 
    foo(6); 
    std::cout << numberRef; 
    return 0; 
}