I think that reinterpret_cast can be use for all types of casts, because it's force any type casts to another type with all side-effects of this conversion. 
That is a common misconception. Conversions which can be performed with reinterpret_cast are listed explicitly in 5.2.10 of the standard. int-to-enum and enum-to-int conversions are not in the list:
- Pointer to integral type, so long as the integer is large enough to hold it
- nullptr_tto integer
- integral type or enumto pointer
- function pointer to another function pointer of different type
- object pointer to another object pointer of different type
- nullptr_tto other pointer type
- pointer-to-member of T1to a different pointer-to-member ofT2in cases where bothT1andT2are objects or functions
reinterpret_cast is typically used to tell the compiler: Hey, I know you think this region of memory is a T, but I'd like you to interpret it as a U (where T and U are unrelated types).
It is also worth noting that reinterpret_cast can have effects on the bits:
5.2.10.3
[ Note: The mapping performed by reinterpret_cast might, or might not, produce a representation dif-
  ferent from the original value. — end note ]
The C-style cast always works, because it included static_cast in its attempts.