Почему 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
.