Почему int & a = ‹value› не допускается в C ++?

Я читаю о ссылках на C ++. В нем говорится, что int& a = 5 дает ошибку времени компиляции.

В статье Thinking in C ++ - Bruce Eckel автор говорит, что компилятор должен сначала выделить память для int и создать адрес для привязки к ссылке. Хранилище должно быть const, потому что его изменение не имеет смысла.

Я сбит с толку. Я не могу понять логику этого. Почему нельзя изменить содержимое хранилища? Я понимаю, что он недействителен согласно правилам C ++, но почему?


person Neeraj Gangwar    schedule 15.10.2013    source источник
comment
возможный дубликат Почему не- Ссылка const не может быть привязана к временному объекту?   -  person legends2k    schedule 15.10.2013


Ответы (3)


«Хранилище должно быть постоянным, поскольку его изменение не имеет смысла».

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

const int &a = 123;
a = 1000; // `a` is referencing to temporary 123, it is not possible to change it
          // We can not change 123 to 1000
          // Infact, we can change a variable which its value is 123 to 1000
          // Here `a` is not a normal variable, it's a reference to a const
          // Generally, `int &a` can not bind to a temporary object

Для неконстантных привязок:

int x = 1;
int &a = x;

a - это ссылка на lvalue. Проще говоря, это псевдоним для другой переменной, поэтому справа вы должны указать переменную. Ссылка a не может быть изменена и привязана к другой переменной после первой привязки;

В C ++ 11 вы можете ссылаться на временные объекты / значения с помощью ссылок rvalue:

int &&a = 123;
person masoud    schedule 15.10.2013

int& a = 5;

Чтобы приведенный выше код работал, int& необходимо выполнить привязку к временному объекту типа int, созданному из выражения 5. Но привязка int& к временной шкале не понравилась Бьярну Страуструпу, и он привел пример, подобный следующему, чтобы проиллюстрировать свою точку зрения:

void f(int &i) { ++i; }

float x = 10.0;
f(x); 
std::cout << x <<< std::endl;

Что std::cout напечатает 1? Похоже, он напечатает 11.

Он чувствует, что ++i меняет аргумент x, но это не так. Это одна из причин, по которой создатель C ++ не разрешил временным файлам привязываться к неконстантной ссылке.

Однако вы можете сделать это:

int const & i = 10;
int const & j = x; //x is float

А начиная с C ++ 11 вы можете сделать это:

int && i = 10;
int && i = x; //x is float

Надеюсь, это поможет.


1. предполагая, что int& может связываться с временным, созданным из x.

person Nawaz    schedule 15.10.2013
comment
+1 для примера f(): ЭТО. Иногда я задавался вопросом, почему l-refs не может сам связываться с временными, но никогда не думал об этом. Спасибо, что расширили кругозор :-) - person Angew is no longer proud of SO; 15.10.2013
comment
Спасибо за ответ. Итак, из вашего ответа я пришел к выводу, что Бьярн Страуструп только что сделал это. Я просто хочу убедиться, что не упускаю логики, которая стоит за всей этой концепцией! - person Neeraj Gangwar; 16.10.2013

Что ты можешь сделать, это

int b=5;
int &a=b;

or

const int& a = 5;
person Fabrice Jammes    schedule 15.10.2013