Предполагая, что n2
имеет некоторый встроенный тип, приведение к типу int &
выполняет реинтерпретацию значения lvalue n1
(независимо от того, какой тип он имел) в качестве значения lvalue типа int
,
В контексте объявления int n2 = (int &) n1
, если n1
само по себе является lvalue типа int
, приведение является излишним, оно абсолютно ничего не меняет. Если n1
является lvalue типа const int
, то приведение просто отбрасывает константу, что также является излишним в вышеуказанном контексте. Если n1
является lvalue какого-либо другого типа, приведение просто интерпретирует память, занятую n1
, как объект типа int
(это называется type punning ). Если n1
не является lvalue, код неверен.
Таким образом, в коде, подобном int n2 = (int&) n1
, приведение к int &
не является избыточным (имеет некоторый фактический эффект), когда оно выполняет тип punning, т.е. когда n1
является lvalue некоторого другого типа (не *) 1027 *). Например
float n1 = 5.0;
int n2 = (int &) n1;
что будет эквивалентно
int n2 = *(int *) &n1;
и
int n2 = *reinterpret_cast<int *>(&n1);
Излишне говорить, что это довольно плохая практика программирования.
Это, кстати, один из случаев, когда использование выделенного C ++-стиля настоятельно рекомендуется. Если бы автор кода использовал reinterpret_cast
вместо приведения в стиле C, вам, вероятно, не пришлось бы задавать этот вопрос.
Конечно, если n1
сам по себе имеет тип int
, то для этого состава нет значимого объяснения. В этом случае, опять же, совершенно излишним.
P.S. Также существует вероятность, что n2
- это класс с перегруженным оператором преобразования в тип int &
, что совершенно другая история. В любом случае, вы должны сказать, что такое n2
, когда задаете такие вопросы.