G-Fact 12
March 8, 2010
C allows a void* pointer to be assigned to any pointer type without a cast, whereas C++ does not; this idiom appears often in C code using malloc memory allocation. For example, the following is valid in C but not C++:
void* ptr; int *i = ptr; /* Implicit conversion from void* to int* */
or similarly:
int *j = malloc(sizeof(int) * 5); /* Implicit conversion from void* to int* */
In order to make the code compile in both C and C++, one must use an explicit cast:
void* ptr; int *i = (int *) ptr; int *j = (int *) malloc(sizeof(int) * 5);
Source:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B


The type emphasis of C++ enforces user to pay attention at unusual conversions. Hence the programmer needs to cast void type to concrete type.
There are multiple uses in preventing such implecit conversion. The user can be protected from mis-aligned memory exceptions. If we use explicit casting, the compiler treats that the programmer is aware of possibilities.
The converse can be done easily without any casting. Casting from concrete to void is allowed, since no operations on void are defined.