It's mostly implementation-defined.
Technically, if you violate the contract, your code has
undefined behavior. Most good implementations have defined it,
however.
Standard vector::iterators, for example, are usually just
pointers; in the debug version of STLPort, though, they're of
a runtime-checked class type.
Is there any modern version of the STL in which any of the
iterators are just pointers. It's not the case with g++; I'll
admit that I've not looked at the sources elsewhere, but since
VC++ (Dinkumware) also traps most of the possible runtime
errors, I don't think that they use raw pointers either.