Я часто вижу высказывания, подобные приведенным ниже, в книгах 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**?
Причина по которой int & r2 = r1;
терпит неудачу, потому что вы удалили cv-квалификатор const
когда ссылка соотносится от r2 до r1.
Смотрите стандартный рабочий проект C ++, n3797, 8.5.3 / 5:
Если T1 связан со ссылкой на T2, cv1 должен быть такой же квалификации cv, как или выше
CV-квалификация, чем, CV2.
Простой ответ: нет
Более длинный ответ: вы не можете этого сделать. Когда у вас есть const &
он всегда будет оставаться константным (если вы не используете константное кастование или другие явные вещи). Это сделано специально, так как в противном случае правильность const не будет иметь большого значения, а также является причиной, по которой вы не можете скомпилировать свой код.
Прежде всего, предоставленный код недействителен, так как вы не можете инициализировать непостоянную ссылку постоянной ссылкой.
Что касается вашего вопроса, может быть проще рассматривать ссылку как особый вид указатель на объект, на который автоматически ссылаются (цитируемое вами предложение вводит в заблуждение).
Ваш вопрос запутался, так или иначе, назначение ссылки делает не изменить постоянство исходного объекта.
И ваш код не будет компилироваться без const_cast.
int& r2 = const_cast<int&>(r1);
Ты можешь использовать const_cast
за то, что отбросил постоянство.
Книги лгут. C ++ ссылки * const
замаскированные указатели с некоторым специальным синтаксисом. Ссылка на const может продлить жизнь временного, что указатели не могут. Вот и все.
Ссылки были изобретены только для обеспечения удобного синтаксиса для перегрузки операторов. Я все еще люблю ссылки и использую их, но я не питаю иллюзий, что они «волшебны» и «совершенно отличаются от указателей».