
In these case the equivalence relation is not a property of the types but of the values they represent, no matter how much handwaving goes on around here about how those cases aren't important. They can be a property of the types involved, but they just aren't in this circumstance, as const char* can mean too many different things.
From this argument, I might be led to believe that exceptional cases are viable arguments against generality. If there isn't sufficient memory to compute a + b for strings, then + must not be associative? If I can't divide by 0, then division by any number doesn't have meaning? A C-string with an embedded \0 invalidates some equality comparisons, so the rest can't be trusted to compare equal?
They're preconditions. They state where an operation is undefined for a specific set of values. They aren't contradictions.