st_ :: aligned_storage的static_cast和reinterpret_cast

hon*_*pei 11 c++ alignment static-cast reinterpret-cast

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

可以使用以下代码

return *static_cast<const T*>(static_cast<const void*>(&data[pos]));
Run Code Online (Sandbox Code Playgroud)

被替换为

 return *reinterpret_cast<const T*>(&data[pos]);
Run Code Online (Sandbox Code Playgroud)

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

香港

Yur*_*yda 5

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

指向对象的指针可以显式转换为指向不同对象类型的指针.当prvalue v类型的"指针T1"被转换为类型"指针cv T2",结果是static_cast<cv T2*>(static_cast<cv void*>(v)) 如果两个T1T2是标准布局类型和的对准要求T2并不比那些更严格T1.

将"指向T1"的类型的prvalue转换为"指向T2的指针"类型(其中T1T2是对象类型,并且对齐要求T2不比那些更严格T1)并返回其原始类型,产生原始指针值.任何其他此类指针转换的结果都是未指定的.

所以,我们可以得出以下结论:

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