Когда const ref заменяется исходным объектом (неконстантным), исчезает ли константа?

Я часто вижу высказывания, подобные приведенным ниже, в книгах C ++, касающихся ссылок:

Ссылка — это просто другое имя исходного объекта. Когда он используется, он заменяется исходным объектом (в большинстве случаев).

Вот вопрос:
Если я связываю const ref с неконстантным объектом, когда этот const ref используется и заменяется исходным объектом, константность исчезает?

int i = 42;
const int & r1 = i;
int & r2 = r1; // Question: shouldn't r1 here just be replaced by the original object, which is **non-const**?

1

Решение

Причина по которой int & r2 = r1; терпит неудачу, потому что вы удалили cv-квалификатор const когда ссылка соотносится от r2 до r1.

Смотрите стандартный рабочий проект C ++, n3797, 8.5.3 / 5:

Если T1 связан со ссылкой на T2, cv1 должен быть такой же квалификации cv, как или выше
CV-квалификация, чем, CV2.

0

Другие решения

Простой ответ: нет

Более длинный ответ: вы не можете этого сделать. Когда у вас есть const & он всегда будет оставаться константным (если вы не используете константное кастование или другие явные вещи). Это сделано специально, так как в противном случае правильность const не будет иметь большого значения, а также является причиной, по которой вы не можете скомпилировать свой код.

2

Прежде всего, предоставленный код недействителен, так как вы не можете инициализировать непостоянную ссылку постоянной ссылкой.

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

0

Ваш вопрос запутался, так или иначе, назначение ссылки делает не изменить постоянство исходного объекта.

И ваш код не будет компилироваться без const_cast.

int& r2 = const_cast<int&>(r1);

Ты можешь использовать const_cast за то, что отбросил постоянство.

0

Книги лгут. C ++ ссылки * const замаскированные указатели с некоторым специальным синтаксисом. Ссылка на const может продлить жизнь временного, что указатели не могут. Вот и все.

Ссылки были изобретены только для обеспечения удобного синтаксиса для перегрузки операторов. Я все еще люблю ссылки и использую их, но я не питаю иллюзий, что они «волшебны» и «совершенно отличаются от указателей».

-1
По вопросам рекламы [email protected]