2013-06-11 25 views
9

Ho scritto una funzione che restituisce un riferimento all'oggetto locale.Funzione che restituisce un riferimento all'oggetto locale

Fraction& operator*(Fraction& lhs, Fraction& rhs) 
{ 
    Fraction res(lhs.num*rhs.num,lhs.den*rhs.den); 
    return res; 
} 

Dopo funzione restituiscono res oggetto viene distrutto e ricezione oggetto punterà oggetto Ex-Frazione portando ad un comportamento indefinito di utilizzarlo. Chiunque utilizzi questa funzione si troverà ad affrontare un problema.

Perché il compilatore non è in grado di rilevare questo tipo di situazione come errore di compilazione?

+13

Generalmente può - g ++ stampa qualcosa come 'warning: riferimento alla variabile locale 'x' restituita [abilitata di default]'. Potrebbe dipendere dal compilatore che stai usando e/o dagli switch del compilatore che hai usato. –

+2

Questo è ciò che gli avvisi sono per, il tempo di trattare tutti gli avvisi come errore. – yngccc

+0

Nota è possibile tornare con riferimento costante e andrà bene – dchhetri

risposta

19

La maggior parte dei compilatori mostrerà un avviso quando lo fai. Dovresti sempre attivare gli avvisi con un'opzione come GCC -Wall.

Per quanto riguarda il motivo per cui lo standard non richiede un errore, è perché una funzione con controllo di flusso renderà difficile stabilire se il valore di ritorno fa riferimento a un locale o meno. (E il comportamento non definito si verifica solo se il chiamante restituisce il valore restituito.)

+0

puoi dare un esempio per tale situazione "difficile da dire", senza aritmetica/creazione del puntatore? – Elazar

+8

@Elazar Sure, 'return fn (local_var);' La funzione potrebbe restituire un riferimento al suo argomento, che è una variabile locale. Oppure 't & ref = flag? local: global; 'e successivamente' return ref; '. Quindi il compilatore deve dimostrare che la funzione restituisce (al contrario dell'uscita per eccezione) solo se 'flag' era' false'. – Potatoswatter

+0

Penso che il compilatore dovrebbe emettere un avvertimento per il 'return ref' che punta all'espressione condizionale. Questa è un'analisi "può". 'return fn (local)' è una storia diversa, sono d'accordo. – Elazar

Problemi correlati