Supponendo n2
è di qualche tipo built-in, il cast al tipo int &
esegue la reinterpretazione di lvalue n1
(qualunque sia il tipo che aveva) come valore assegnabile di digitare int
.
Nel contesto di int n2 = (int &) n1
dichiarazione, se n1
è di per sé un lvalue di tipo int
, il cast è superfluo, cambia assolutamente nulla. Se n1
è un lvalue di tipo const int
, allora il cast cancella semplicemente la costanza, che è anche superflua nel contesto di cui sopra. Se n1
è un Ivalue di un altro tipo, il cast semplicemente rilegge memoria occupata da n1
come un oggetto di tipo int
(questo è chiamato tipo punning). Se n1
non è un lvalue il codice è mal formato.
Così, nel codice come int n2 = (int&) n1
il cast int &
solo non ridondante (ha qualche effetto reale) quando esso tipo gioco di parole, cioè quando n1
è un Ivalue di qualche altro tipo (non int
). Per esempio
float n1 = 5.0;
int n2 = (int &) n1;
che sarebbe equivalente a
int n2 = *(int *) &n1;
e
int n2 = *reinterpret_cast<int *>(&n1);
Inutile dire che questa è una pratica di programmazione piuttosto male.
Questo è, BTW, uno dei casi in cui si utilizza un cast in stile C++ dedicato è fortemente preferito. Se l'autore del codice utilizzava reinterpret_cast
anziché il cast in stile C, probabilmente non dovresti fare questa domanda.
Ovviamente, se n1
è di tipo int
, non c'è spiegazione significativa per questo cast. In tal caso è, di nuovo, del tutto superfluo.
P.S. C'è anche la possibilità che n2
sia una classe con operatore di conversione sovraccarico sul tipo int &
, che è una storia completamente diversa ... Comunque, devi dire cosa è n2
quando fai domande del genere.
Il mio C++ è arrugginito, ma penso che a * possa essere usato per allocare un int o avere una serie di int. Sono in perdita per ciò che il & vorrà dire in questo caso però. –
Qual è il tipo di n1? –
"la modifica di n1 non riflette n1" ?? –