ifs.read(reinterpret_cast<char*>(txt), 16);
A static_cast
is
a cast from one type to another that (intuitively) is a cast that could under some circumstance succeed and be meaningful in the absence of a dangerous cast. For example, you can static_cast
a void*
to
an int*
,
since the void*
might
actually point at an int*
,
or an int
to
achar
,
since such a conversion is meaningful. However, you cannot static_cast
an int*
to
a double*
,
since this conversion only makes sense if the int*
has
somehow been mangled to point at a double*
.
A reinterpret_cast
is
a cast that represents an unsafe conversion that might reinterpret the bits of one value as the bits of another value. For example, casting an int*
to
a double*
is
legal with a reinterpret_cast
,
though the result is unspecified. Similarly, casting an int
to
a void*
is
perfectly legal with reinterpret_cast
,
though it's unsafe.
Neither static_cast
nor reinterpret_cast
can
remove const
from
something. You cannot cast a const
int*
to an int*
using
either of these casts. For this, you would use a const_cast
.
A C-style cast of the form (T)
is
defined as trying to do a static_cast
if
possible, falling back on a reinterpret_cast
if
that doesn't work. It also will apply a const_cast
if
it absolutely must.
In general, you should always prefer static_cast
for
casts that should be safe. If you accidentally try doing a cast that isn't well-defined, then the compiler will report an error. Only use reinterpret_cast
if
what you're doing really is changing the interpretation of some bits in the machine, and only use a C-style cast if you're willing to risk doing a reinterpret_cast
.
For your case, you should use the static_cast
,
since the downcast from the void*
is
well-defined in some circumstances.