Can we reassign the reference in C++?
ri = j; // >>> Is this not reassigning the reference? <<<
No, ri
is still a reference to i
- you can prove this by printing &ri
and &i
and seeing they're the same address.
What you did is modify i
through the reference ri
. Print i
after, and you'll see this.
Also, for comparison, if you create a const int &cri = i;
it won't let you assign to that.
It seems as if I have actually succeeded in reassigning a reference. Is that true?
No, you haven't. You are actually reassigning the value, and you are not rebinding the reference.
In your example, when you do int &ri = i;
, ri
is bound to i
for its lifetime. When you do ri = j;
, you are simply assigning the value of j
to ri
. ri
still remains a reference to i
! And it results in the same outcome as if you had instead written i = j;
If you understand pointers well, then always think of the reference as an analogical interpretation of T* const
where T
is any type.
When you assign something to a reference you actually assign the value to the object the reference is bound to. So this:
ri=j;
has the same effect as
i = j;
would have because ri
is bound to i
. So any action on ri
is executed on i
.
You are not reassigning the reference when executing ri = j;
. You're actually assigning j
to i
. Try printing i
after the line and you'll see that i
changed value.