In C, you have to strip away the constness and then later initialize it, but it isn't guaranteed to work.
This is undefined behavior, so anything can happen, including the program crashing.
However, if they allow this feature to exist, then they must've had a good reason
You are incorrectly assuming that there is sane rationale behind everything in the C language. More likely, const size_t s;
is allowed just because the syntax happened to be specified like that - it doesn't treat the const type qualifier any different than the other type qualifiers (such as volatile).
So why did this change in C++?
Probably because it doesn't make any sense to declare an uninitialized constant.