void* happens to be one of the only types that implicitly casts to other pointers in C. You can also assign T* to const T* or T const* or const T const* without complaint. That exception makes sense to you hopefully because on one end, you don't care if it's constant, buut the other end wants to treat values constant. With T* to S* an assumption is made about what the pointed to object is. So for me it's really not an argument, because even in C you have to explicitly cast T* to S*. The only thing C++ tells me in void*'s case is that I can't treat some address as another pointer type, and that doesn't make sense. At least C compilers are smart enough to handle special cases. :p
Me: Not arguing. You make the same assumptions about *T and *S when you convert explicitly though, so I am not sure I understand.
You: This part I don't understand what you're trying to imply, though.