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

Original source

Related problems