static_cast and reinterpret_cast for std::aligned_storage

时光怂恿深爱的人放手 提交于 2019-12-01 14:24:49

问题


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


回答1:


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:

  1. reinterpret_cast<*T>(ptr) is eqiuvalent to static_cast<*T>(static_cast<void*>(ptr))
  2. static_cast<>(ptr) is not always equal to ptr, but reinterpret_cast<>(ptr) is always equal to ptr
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!