st_ :: aligned_storage的static_cast和reinterpret_cast

时间:2013-10-10 15:32:32

标签: c++ alignment reinterpret-cast static-cast

有人可以在http://en.cppreference.com/w/cpp/types/aligned_storage中解释一下关于投射的一些代码吗?

可以使用以下代码

return *static_cast<const T*>(static_cast<const void*>(&data[pos]));

替换为

 return *reinterpret_cast<const T*>(&data[pos]);

为什么这里使用了两个铸件? 非常感谢。

1 个答案:

答案 0 :(得分:5)

根据标准(第5.2.10节reinterpret_cast,第7节):

  

指向对象的指针可以显式转换为指向不同对象类型的指针。当“指向v的指针”的prvalue T1转换为“指向cv T2的指针”时,如果{{1},结果为static_cast<cv T2*>(static_cast<cv void*>(v)) }和T1是标准布局类型,T2的对齐要求不比T2更严格。

     

将“指向T1的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1T1是对象类型,{{1}的对齐要求并不比T2更严格,并且返回其原始类型会产生原始指针值。 任何其他此类指针转换的结果都未指定。

因此,我们可以得出以下结论:

  1. T2T1
  2. 相同
  3. reinterpret_cast<*T>(ptr)并不总是等于static_cast<*T>(static_cast<void*>(ptr)),但static_cast<>(ptr)始终等于ptr
  4. 如果没有对齐问题,我们可以安全地使用reinterpret_cast<>(ptr)