2013-05-06 7 views
5

mi sorprende scoperto oggi che il seguente codice è completamente valido (GCC 4.4.5):interessante caso di ombreggiamento parametro C++ (parametro non oscurato in un blocco if)

int get_int(const int& i) 
{ 
    if(i == 0) 
    { 
     int i = 1; 
     return i; 
    } 
    return i;  
} 

Sono davvero sorpreso. Se devo accettarlo, allora posso dire che ha senso, perché la nuova variabile si trova all'interno del suo blocco, quindi il resto del codice all'esterno può ancora accedere al parametro, quindi il parametro non è veramente in ombra. Ma non ha ancora senso per me perché NON abbiamo fatto questa sintassi non valida? Non vedo alcun beneficio nel permettere questo, e infatti, ho dovuto solo scavare in un errore causato da questo. Era una funzione lunga e ho creato la mia variabile senza rendermi conto che ha lo stesso nome di un parametro, e alcune righe di codice più avanti (stesso blocco) c'è una dipendenza da quella stessa variabile parametro, e boom ora sta usando la mia versione e ci passa un'ora della mia giornata.

Ho conoscenza superficie molto su compilatori, quindi qualcuno potrebbe spiegare a me l'intera storia dietro a questo comportamento? Come confronto, nel codice Java come questo non è valido (variabile duplicata).

+0

Non un esperto di compilatori o ma ho il sospetto il fatto che l'argomento è un int & e la variabile "shadowing" solo un int di essere nel ciclo qui. –

+0

Ho anche provato 'get_int (int i)' non fa differenza – user1861088

+5

L'ambito di 'int i' è il blocco in cui è dichiarato. Questo ombreggia il parametro all'interno del blocco, ma non al di fuori di esso. Se stai chiedendo "Perché una variabile è circoscritta al blocco anziché alla funzione?" la risposta è "Questo è quello che dicono le regole della lingua". Lingue diverse seguono regole diverse. Questo è ciò che li rende diversi. –

risposta

1

Se stai chiedendo il motivo per cui C++ permette questo , la risposta è semplice: per accettare un codice C valido.

Semplifica anche le regole, per gestire allo stesso modo significati diversi per lo stesso identificatore in ambiti diversi, senza preoccuparsi se gli ambiti coinvolti sono spazi dei nomi, classi, funzioni o ambiti di blocco.

+0

mente spiegando un po 'di più? potresti illustrare come questo ha qualcosa a che fare con l'accettazione di un codice C valido? – user1861088

+0

La popolarità di C++ quando è stata introdotta dipendeva dal fatto che praticamente tutto il buon codice C era accettabile secondo le regole C++. –

-4

Non stanno passando una variabile, ma un punto di riferimento. Citando Bjarne Stroustroup nel il C++ linguaggio di programmazione - "Un riferimento può essere utilizzato per implementare una funzione che dovrebbe modificare il valore del suo argomento" p.62

+0

Manca il punto della domanda, che è "Perché posso oscurare parzialmente un parametro?" –

+0

non hai ricevuto la domanda .. scusa non l'ho messo in modo più chiaro. Inoltre ho passato in un riferimento const quindi non farebbe comunque la differenza – user1861088

Problemi correlati