Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assigning char to int reference and const int reference in C++

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.

like image 760
Masked Man Avatar asked Dec 08 '12 18:12

Masked Man


2 Answers

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.

like image 149
Praetorian Avatar answered Sep 25 '22 02:09

Praetorian


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 ]

like image 29
101010 Avatar answered Sep 25 '22 02:09

101010