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

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

на мышление на C++ - Брюс Экель, автор говорит, что компилятор должен сначала выделить место для хранения int и введите адрес для привязки к ссылке. Хранилище должны быть const, потому что изменение его не имело бы смысла.

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

3 ответов


"хранилище должно быть const, потому что его изменение не имеет смысла."

если вы хотите a быть ссылкой на значение const, вы должны объявить его как 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

для не-const Привязок:

int x = 1;
int &a = x;

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

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

int &&a = 123;

int& a = 5;

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

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.


что вы можете сделать, это

int b=5;
int &a=b;

или

const int& a = 5;