static_cast and reinterpret_cast for std::aligned_storage
alignment, c++, reinterpret-cast, static-cast
Solution
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 to `T1`” is converted to the type “pointer to `cv T2`”, the result is `static_cast<cv T2*>(static_cast<cv void*>(v))` if both `T1` and `T2` are standard-layout types and the alignment requirements of `T2` are no stricter than those of `T1`.
Converting a prvalue of type “pointer to `T1`” to the type “pointer to T2” (where `T1` and `T2` are object types and where the alignment requirements of `T2` are no stricter than those of `T1`) 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 to `static_cast<*T>(static_cast<void*>(ptr))`
- `static_cast<>(ptr)` is not always equal to `ptr`, but `reinterpret_cast<>(ptr)` is always equal to `ptr`
- if there is no alignment issues, we can use `reinterpret_cast` safely
Problem
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