I suspect it's because the compiler would have to two type conversions to make the statement work. If I recall right, code must require at most one conversion. Otherwise figuring out which conversion to use gets too crazy.
In this case, it's key to realize that the value of the ?: operator has one type. That means the 2nd and 3rd operands must have the same type, or you must be able to convert 1 to the other.
So let's look at both statements: Base x = s ? *p : a;
Okay. Converts *p to Base & and creates x with copy constructor
Base y = s ? *c : a;
Not okay. You need an explicit cast to remove the const-ness of *c, so whatever type ?: has, it must be const. The conversion fails because the compiler would have to convert both *c and b to const Base &