Что такое постоянная ссылка? (не ссылка на константу)
Довольно теоретический вопрос... Почему константные ссылки не ведут себя так же, как постоянные указатели, и я могу фактически изменить объект, на который они указывают? Они действительно кажутся еще одной декларацией простой переменной. Зачем мне их использовать? Это короткий пример, который я запускаю, который компилируется и запускается без ошибок:
int main (){
int i=0;
int y=1;
int&const icr=i;
icr=y; // Can change the object it is pointing to so it not like a const pointer...
icr=99; // Can assign another value but the value is not assigned to y...
int x=9;
icr=x;
cout<<"icr: "<<icr<<", y:"<<y<<endl;
}
Ответы
Ответ 1
Самый ясный ответ.
Имеет смысл "X & const x" ?
Нет, это бессмыслица
Чтобы узнать, что означает указанное выше объявление, прочитайте его справа налево: "x является константой ссылки на X". Но это избыточно - ссылки всегда являются константами в том смысле, что вы никогда не сможете переустановить ссылку чтобы ссылаться на другой объект. Никогда. С или без Уст.
Иными словами, "X & const x" функционально эквивалентен "X & x". Поскольку вы ничего не набрали, добавив const после &, вы shouldnt добавить его: это смутит людей - const сделает некоторые люди считают, что X const, как будто вы сказали "const X & x".
Ответ 2
В заявлении icr=y;
ссылка не ссылается на y
; он присваивает значение y
переменной, на которую ссылается icr
, i
.
Ссылки по существу const
, то есть вы не можете изменить то, на что они ссылаются. Есть "const
ссылки", которые действительно являются "ссылками на const
", то есть вы не можете изменить значение объекта, к которому они обращаются. Они объявлены const int&
или int const&
, а не int& const
, хотя.
Ответ 3
Что такое постоянная ссылка (не ссылка на константу)
Постоянная ссылка - это Ссылка на константу.
Постоянная ссылка/Ссылка на константу обозначается:
int const &i = j; //or Alternatively
const int &i = j;
i = 1; //Compilation Error
Это в основном означает, что вы не можете изменить значение объекта типа, которому ссылаются ссылки.
Пример:
Пытаясь изменить значение (присваивать 1
) переменной j
через константу-ссылку, i
приведет к ошибке:
назначение ссылки только для чтения 'i
icr=y; // Can change the object it is pointing to so it not like a const pointer...
icr=99;
Не меняет ссылку, присваивает значение типа, к которому относится ссылка.
Ссылки не могут быть использованы для ссылки на любую другую переменную, кроме той, к которой они привязаны при инициализации.
Первый оператор присваивает значение y
- i
Второй оператор присваивает значение 99
- i
Ответ 4
Под "постоянной ссылкой" я предполагаю, что вы действительно имеете в виду "ссылку на постоянные данные". Указатели, с другой стороны, могут быть постоянными указателями (сам указатель является постоянным, а не данными, на которые он указывает), указателем на постоянные данные или обоими.
Ответ 5
Этот код плохо сформирован:
int&const icr=i;
Ссылка: C++ 17 [dcl.ref]/1:
Cv-квалифицированные ссылки некорректны, за исключением случаев, когда cv-квалификаторы вводятся посредством использования typedef-name или decltype-спецификатора, и в этом случае cv-квалификаторы игнорируются.
Это правило присутствовало во всех стандартизированных версиях C++. Потому что код плохо сформирован:
- Вы не должны использовать это, и
- нет связанного поведения.
Компилятор должен отклонить программу; и если это не так, поведение исполняемого файла полностью не определено.
NB: Не уверен, что ни один из других ответов не упомянул это еще... никто не получил доступ к компилятору?
Ответ 6
Как уже упоминалось в других ответах, ссылка по своей сути постоянна.
int &ref = obj;
После того, как вы инициализировали ссылку с объектом, вы не можете отсоединить эту ссылку с ее объектом, на который она ссылается. Ссылка работает так же, как псевдоним.
Когда вы объявляете const
ссылку, это не что иное, как ссылка, которая ссылается на константный объект.
const int &ref = obj;
Приведенные выше декларативные предложения, такие как const
и int
, определяют доступные возможности объекта, на которые будет ссылаться ссылка. Чтобы быть более понятным, я хочу показать вам pointer
эквивалентный const
ссылке;
const int *const ptr = &obj;
Таким образом, приведенная выше строка кода эквивалентна const
ссылке в своем рабочем виде. Кроме того, есть еще один момент, который я хочу упомянуть;
Ссылка должна быть инициализирована только с объектом
Поэтому, когда вы сделаете это, вы получите ошибку;
int &r = 0; // Error: a nonconst reference cannot be initialized to a literal
Это правило имеет одно исключение. Если ссылка объявлена как const, то вы также можете инициализировать ее литералами;
const int &r = 0; // a valid approach
Ответ 7
Сначала я думаю, что int&const icr=i;
is просто int& icr = i
, модификатор 'const' не имеет смысла (это просто означает, что вы не можете сделать ссылку ссылающейся на другую переменную).
const int x = 10;
// int& const y = x; // Compiler error here
Во-вторых, постоянная ссылка означает, что вы не можете изменить значение переменной через ссылку.
const int x = 10;
const int& y = x;
//y = 20; // Compiler error here
В-третьих, ссылки на константы могут связывать правильные значения. Компилятор создаст временную переменную для привязки ссылки.
float x = 10;
const int& y = x;
const int& z = y + 10;
cout << (long long)&x << endl; //print 348791766212
cout << (long long)&y << endl; //print 348791766276
cout << (long long)&z << endl; //print 348791766340