Подтвердить что ты не робот

Что такое постоянная ссылка? (не ссылка на константу)

Довольно теоретический вопрос... Почему константные ссылки не ведут себя так же, как постоянные указатели, и я могу фактически изменить объект, на который они указывают? Они действительно кажутся еще одной декларацией простой переменной. Зачем мне их использовать? Это короткий пример, который я запускаю, который компилируется и запускается без ошибок:

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; 
}
4b9b3361

Ответ 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