could someone please explain the bit of code about casting in http://en.cppreference.com/w/cpp/types/aligned_storage please?
can the following code
return *static_cast<const T*>(static_cast<const void*>(&data[pos]));
be replaced with
return *reinterpret_cast<const T*>(&data[pos]);
?
Why here two casting are used? Thanks a lot.
Hong
According to the standard (§ 5.2.10 reinterpret_cast
, section 7):
A pointer to an object can be explicitly converted to a pointer to a different object type. When a prvalue
v
of type “pointer toT1
” is converted to the type “pointer tocv T2
”, the result isstatic_cast<cv T2*>(static_cast<cv void*>(v))
if bothT1
andT2
are standard-layout types and the alignment requirements ofT2
are no stricter than those ofT1
.Converting a prvalue of type “pointer to
T1
” to the type “pointer to T2” (whereT1
andT2
are object types and where the alignment requirements ofT2
are no stricter than those ofT1
) and back to its original type yields the original pointer value. The result of any other such pointer conversion is unspecified.
So, we could make the following conclusion:
reinterpret_cast<*T>(ptr)
is eqiuvalent tostatic_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
is not always equal toptr
, butreinterpret_cast<>(ptr)
is always equal toptr
- if there is no alignment issues, we can use
reinterpret_cast
safely
来源:https://stackoverflow.com/questions/19300142/static-cast-and-reinterpret-cast-for-stdaligned-storage