I noticed that assigning a char
to a const int&
compiles, but assigning it to a int&
gives a compilation error.
char c;
int& x = c; // this fails to compile
const int& y = c; // this is ok
I understand that it is not a good practice to do this, but I am curious to know the reason why it happens.
I have searched for an answer by looking for "assigning to reference of different type", "assigning char to a int reference", and "difference between const reference and non-const reference", and came across a number of useful posts (int vs const int& , Weird behaviour when assigning a char to a int variable , Convert char to int in C and C++ , Difference between reference and const reference as function parameter?), but they do not seem to be addressing my question.
My apologies if this has been already answered before.
int& x = c;
Here an implicit conversion from char
to int
is being performed by the compiler. The resulting temporary int
can only be bound to a const
reference. Binding to a const int&
will also extend the lifetime of the temporary result to match that of the reference it is bound to.
This behaviour is justified in the standard N4527 at 8.5.3/p5.2 References [dcl.init.ref]
5 A reference to type “cv1 T1” is initialized by an expression of type “cv2 T2” as follows:
...
5.2 Otherwise, the reference shall be an lvalue reference to a non-volatile const type (i.e., cv1 shall be const), or the reference shall be an rvalue reference. [ Example:
double& rd2 = 2.0; // error: not an lvalue and reference not const int i = 2; double& rd3 = i; // error: type mismatch and reference not const
— end example ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With