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).
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. –
Ho anche provato 'get_int (int i)' non fa differenza – user1861088
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. –