Разница в C ++ между константной ссылкой на неконстантный объект и неконстантной ссылкой на неконстантный объект - PullRequest
0 голосов
/ 30 августа 2018

Какова цель ключевого слова "const" для ссылки, если объект, на который она ссылается, не является объектом const? Есть ли разница между тем, что делает r1 и r2 (ниже)?

int i = 42; // non const object
const int &r1 = i; // const reference to non const object

int j = 25; // non const object
int &r2 = j; // non const reference to non const object

Вот цитата из CPP Primer 5th:

"Программисты C ++ склонны сокращать фразу" ссылка на const "как «Const reference». Это сокращение имеет смысл - если вы помните, что оно это сокращение. Технически говоря, нет постоянных ссылок. Ссылка не является объект, поэтому мы не можем сделать ссылку самой константой. Действительно, потому что там нельзя ссылаться на другой объект, в каком-то смысле все ссылки являются постоянными. Относится ли ссылка к const или неконстантному Тип влияет на то, что мы можем сделать с этой ссылкой, а не на то, можем ли мы изменить привязка самой ссылки. "

Я думаю, это означает, что создание ссылки "const", когда она ссылается на неконстантный объект, абсолютно ничего не делает. Мы также можем исключить это ключевое слово const при определении этой ссылки.

Задавайте этот вопрос здесь для подтверждения.

Редактировать: похоже, моя первоначальная гипотеза неверна. Теперь я понимаю, что константная ссылка на неконстантный объект имеет цель: не дать этой ссылке изменить объект. Неконстантный объект все еще может быть изменен другими средствами, но не этой константной ссылкой.

Спасибо всем.

Ответы [ 5 ]

0 голосов
/ 31 августа 2018

Если мы используем const с переменной, то его значение не может быть изменено, и когда оно используется со ссылкой на констант, тогда его ссылка не может быть изменена, если мы использовали его с объектом, тогда все данные используются в объекте, они не могут быть изменены.

0 голосов
/ 30 августа 2018

"Какова цель ключевого слова" const "для ссылки, если объект, на который она ссылается, не является объектом const?" Цель состоит в том, чтобы предотвратить использование этой ссылки для изменения объекта, на который она ссылается.

int i = 42; // non const object
const int &r1 = i; // const reference to non const object
r1 = 6 * 9; // error, r1 cannot be used to modify i;
0 голосов
/ 30 августа 2018

Я думаю, это означает, что создание ссылки "const", когда она ссылается на неконстантный объект, абсолютно ничего не делает. Мы также можем исключить это ключевое слово const при определении этой ссылки.

Не соответствует действительности.

Вы не можете изменять объект, не являющийся const, посредством ссылки const.
Вы можете изменить не-1014 * объект с помощью не-const ссылки.

Если объект не создается в разделе программы, доступном только для чтения, он открыт для изменения без неблагоприятных последствий. Однако, когда вы используете ссылку const на объект, отличный от const, вы просите компилятор не позволять вам изменять объект через эту конкретную ссылку. Это не значит, что вы не будете изменять объект.

Это похоже на аргументы функции. Когда функция использует ссылочный тип аргумента const, функция обещает вам, что не будет изменять объект. Это не означает, что объект вообще не может быть изменен.

0 голосов
/ 30 августа 2018

Есть полезный способ выяснить, что означает const ness в указателях и ссылках, а именно прочитать объявление справа налево (см. эти ответы ). Таким образом, const int &r1 можно прочитать как "r1 является ссылкой на int const".

По сути, r1 относится к int, который нельзя изменить. Это означает, что упомянутый int является либо const int, , либо , это просто int. Привязка константной ссылки const к объекту, не являющемуся const (например, при записи чего-то вроде int i = 5; const int& r = i;), совершенно допустима, поскольку нет ничего плохого в том, чтобы не изменять объект, не являющийся const.

0 голосов
/ 30 августа 2018

Чтобы лучше это понять, вы можете посмотреть на разницу между указателем const и указателем на данные const:

int i, j;
const int *p1 = &i; // pointer to constant int
int *const p2 = &i; // constant pointer to int

*p1 = 0; // error, p1 points to const int
*p2 = 0; // it is fine sets i to 0

 p1 = &j; // fine p1 now points to anbother int
 p2 = &j; // error, p2 is a constant pointer

так что теперь, если мы заменим указатель на ссылку, мы сможем увидеть похожие вещи, за исключением того, что ссылка сама по себе неизменна, т.е. вы не можете сделать ссылку для ссылки на другой объект после его создания (в отличие от неконстантного указателя), а любая ссылка похожа на константу указатель. Таким образом, ссылка на const в этом смысле не имеет никакого смысла, и обычно под ссылкой на const подразумевается ссылка на тип const. Вот что означает цитата из учебника для начинающих.

Что касается различий в вашем коде, да, есть разница - вы не можете изменить объект с помощью константной ссылки, не имеет значения, указывает ли эта ссылка на константный объект или нет.

...