Because the standard says so:
§8.5.3.5 ... Otherwise, the reference shall be an lvalue reference to a non-volatile const type ...
However, if you want it very much, you can get it:
#include <iostream>
int main()
{
const int & cr=5;
int & r=const_cast<int &>(cr);
r=6;
std::cout<<r;
}
// outputs 6 with c++/clang++, Debian 8, amd64
But be aware that the supposed constant cr is not const any more, too, and you incur undefined behavior. (§1.9 (4))
As suggested by the above code, there is no technical reason for the difference. Rather, the designers had nightmares about what users would do with non-const references to temporaries.