#cpp #ссылки
У Скотта Мейерса написано:
Если да, это подрывает основы, потому что C++ не позволяет изменить объект, на
который указывает ссылка.
Вопрос: почему приведенный далее код работает в VS2017?
int main()
{
int i = 10;
int& r = i;
r++;
int j = 20;
r = j;
i = 5;
int& r2 = r;
return 0;
}
Ответы
Ответ 1
Судя по всему, вы натолкнулись на этот текст тут. Но там речь идет о совсем другом - присваивании двух переменных, которые являются объектами класса, в которых имеется член-ссылка. И вопрос о том, что при этом должно происходить со ссылкой. В контексте имеется в виду не то, что нельзя изменять сам объект через ссылку, а то, что ссылка не может по ходу дела вдруг начать указывать на другой объект. С++ не позволяет никак менять значение самой ссылки, а не объекта, на который он указывает. Ссылка, в отличие от указателя, не может сначала указывать на объект a, а потом вдруг на объект b. Только на один и тот же объект - тот, которым она инициализирована - все время своего существования. Так понятнее? Да, фраза переведена несколько двусмысленно, не спорю...Ответ 2
Вероятно, Вы не так поняли, что имел ввиду Мейерс. Изменение объектов, на которые указывают ссылки -- вполне возможное действие. Например, когда мы передаем объект в функцию по ссылке. В вашем коде когда вы оперируете с r, вы на самом деле оперируете с объектом, находящимся по адресу, который принадлежит i, и изменяете значение переменной i. Т.о. int & r = i; является "псевдонимом" для переменной i, как когда мы передаем объект в функцию по адресу (по ссылке, например).
Комментариев нет:
Отправить комментарий