The static_cast
is more appropriate for converting a void*
to a pointer of some other type.
static_cast
is the cast of choice when there is a natural, intuitive conversion between two types that isn't necessarily guaranteed to work at runtime. For example, you can use static_cast
to convert base class pointers to derived class pointers, which is a conversion that makes sense in some cases but can't be verified until runtime. Similarly, you can use static_cast
to convert from an int
to a char
, which is well-defined but may cause a loss of precision when executed.
reinterpret_cast
, on the other hand, is a casting operator designed to do conversions that are fundamentally not safe or not portable. For example, you can use reinterpret_cast
to convert from a void *
to an int
, which will work correctly if your system happens to have sizeof (void*)
≤ sizeof (int)
. You can also use reinterpret_cast
to convert a float*
to an int*
or vice-versa, which is platform-specific because the particular representations of float
s and int
s aren't guaranteed to have anything in common with one another.
In short, if you ever find yourself doing a conversion in which the cast is logically meaningful but might not necessarily succeed at runtime, avoid reinterpret_cast
. static_cast
is a good choice if you have some advance knowledge that the cast is going to work at runtime, and communicates to the compiler "I know that this might not work, but at least it makes sense and I have a reason to believe it will correctly do the right thing at runtime." The compiler can then check that the cast is between related types, reporting a compile-time error if this isn't the case. Using reinterpret_cast
to do this with pointer conversions completely bypasses the compile-time safety check.
There are a few circumstances where you might want to use a dynamic_cast
instead of a static_cast
, but these mostly involve casts in a class hierarchy and (only rarely) directly concern void*
.
As for which one is preferred by the spec, neither is overly mentioned as "the right one to use" (or at least, I don't remember one of them being mentioned this way.) However, I think the spec wants you to use static_cast
over reinterpret_cast
. For example, when using a C-style cast, as in
A* ptr = (A*) myVoidPointer;
The order of casting operators that's tried always tries to use a static_cast
before a reinterpret_cast
, which is the behavior you want since reinterpret_cast
isn't guaranteed to be portable.