2012-05-06 8 views
5

Questo succede quando compili il seguente codice in Visual Studio 2010. La mia domanda è: il compilatore C++ avviserà se una funzione restituisce l'indirizzo di una variabile locale, ma perché non avvisa quando restituisce un riferimento locale ad una variabile locale ?Perché il compilatore non avverte "l'indirizzo di ritorno della variabile locale o temporaneo" quando si restituisce un riferimento locale a una variabile locale?

È ancora sbagliato (restituire un riferimento locale a una variabile locale), ma solo che il compilatore non è in grado di rilevarlo? Esaminando gli indirizzi di "num" e "r" si rivela che condividono la stessa posizione di memoria.

#include <iostream> 
using namespace std; 

int & intReference() { 
    int num = 5; 
    int &r = num; 
    cout << "\nAddress of num: " << &num; 

    //return num; // Compiler warning: C4172: returning address of local variable or temporary 
    return r; // No warning? 
} 

void main() { 
    int &k = intReference(); 
    cout << "\nk = " << k; // 5 
    cout << "\nAddress of k: " << &k; // same address as num 

    char c; 
    cin.get(c); 
} 
+0

possibile duplicato di [quali sono le differenze tra questi indirizzo di ritorno delle funzioni locali?] (Http://stackoverflow.com/questions/10410208/what-are-the-differences-between-these-returning-address- of-local-functions) –

+0

Solo per quello che sai, MSVC 2015 non lo avvisa ancora. Neanche su -La porta. Sono appena stato morso da un errore stupido come questo ieri. E sono d'accordo con te, per l'occhio del non compilatore-scrittore, sembra un errore così facile da rilevare. Ad ogni modo, quello che veramente mi infastidisce è che dobbiamo convivere con avvertimenti come il quasi inutile "parametro formale senza riferimento", ma un errore catastrofico come questo ottiene un passaggio libero. – user1593842

risposta

6

Sì, è ancora sbagliato.

Il compilatore non è in grado di rilevare tutti i casi in cui si stanno facendo cose pericolose (o illegali). Avverte quando li trova, ma non può identificare tutti i casi (e non deve).

+0

Quindi questo è sbagliato: http://www.functionx.com/cpp/examples/returnreference.htm – fxam

+3

Sì, questo è un terribile esempio. – Mat

Problemi correlati