Я понял, будет создан временный объект const int, значением которого является a и будет инициализирован b,
Вы ошибаетесь. В этом фрагменте кода не создается ни временный объект
int a = 1;
const int &b = a;
Более того, в Стандарте C ++ даже не указано, выделена ли память для ссылки b.
Следует учитывать ссылку b
в качестве псевдонима для переменной a.
Поскольку ссылка ссылается на объект a
как постоянный объект, вы не можете использовать ссылку для изменения объекта a. Тем не менее объект a объявлен как непостоянный объект. Таким образом, вы можете изменить его значение, например
a = 2;
, но вы не можете изменить его, используя ссылку, например
b = 2;
. Вы можете использовать ссылку для изменения значения объекта a, если ссылка была объявлена как
int &b = a;
В этом случае результат этих двух операторов
a = 2;
и
b = 2;
будет эквивалентен.
Что касается этого фрагмента кода
int a = 1;
const int x = a;
const int &b = x;
a = 2;
std::cout<<b;
, то константе x
присваивается копия значения переменной a
. x
и a
- два разных объекта, которые занимают разные объемы памяти.
Ссылка b
объявляется как ссылка на объект x
.
const int &b = x;
Таким образом, изменение объекта a
не влияет на значение константы x
. Константа x
не может быть изменена ни напрямую, ни с помощью ссылки b
.