Мой вопрос в том, почему можно назначить ссылку на переменную, которая не объявлена как ссылка?
Спасибо.
int &testRef(int &x)
{
return ++x;
}
int main()
{
int x = 1, y;
y = testRef(x); // assigning testRef(x) which is int& to y which is int
return 0;
}
y = testRef(x);
возьмет копию значения ссылки, возвращаемой testRef
. Это может быть полезно, если вы хотите внести последующие изменения в возвращаемое значение.
Если testRef
был возвращать ссылку на const
, тогда у вас не было бы выбора, кроме как взять копию значения, если вы хотите изменить возвращаемое значение. Это помогает в достижении стабильности программы.
Вспомните ссылку как псевдоним, просто имя что-то. Вы не назначаете ссылку. Вы назначаете то, что ссылается на имена (точнее, на то, что они ссылаются).
При передаче по ссылке фактически ничего нового не создается, создается только псевдоним исходного объекта, который указывает на тот же объект. Буквально параметр "x" в функции() и х, передаваемый изначально, один и тот же.
Кстати
int &testRef(int &x)
{
return ++x;
}
возвращение по ссылке позволяет назначить rvalue: что-то вроде
int main()
{
int x = 1, y;
y = testRef(x);
testRef(y) = 5; //by doing this you are assigning y as 5
std::cout<<y;
return 0;
}
x
), LHS (y
).