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
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.