I know only object could have reference. But literals are not object.
So I could understand why following code cannot compile:
int &a = '4';
int &b = 2;
However, when I add const in front of them, it could work!!
const int &a = '4';
const int &b = 2;
I do not know why. Could anyone help me?
A integer or character literal is a prvalue [expr.prim.general]
A literal is a primary expression. Its type depends on its form (2.13). A string literal is an lvalue; all other literals are prvalues.
Since it is a prvalue we are allowed to take a const &
to it but we cannot take a reference to it. If we take a const &
to the temporary the the lifetime of the temporary will be extended to the point where the reference goes out of scope.
{
const int & a = 42;
//line of code
//42 still exits here
} // a goes out of scope and now 42 is gone
(Assiming that you left out '&' in the second snippet.)
Because the literal is not an object; a temporary object is created which has the value corresponding to the literal.
You can bind a temporary to a const reference, and thereby extend that object's lifetime, but you can't bind it to a non-const reference.