有人可以在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]);
为什么这里使用了两个铸件? 非常感谢。
香
答案 0 :(得分:5)
根据标准(第5.2.10节reinterpret_cast
,第7节):
指向对象的指针可以显式转换为指向不同对象类型的指针。当“指向
v
的指针”的prvalueT1
转换为“指向cv T2
的指针”时,如果{{1},结果为static_cast<cv T2*>(static_cast<cv void*>(v))
}和T1
是标准布局类型,T2
的对齐要求不比T2
更严格。将“指向
T1
的指针”类型的prvalue转换为“指向T2的指针”类型(其中T1
和T1
是对象类型,{{1}的对齐要求并不比T2
更严格,并且返回其原始类型会产生原始指针值。 任何其他此类指针转换的结果都未指定。
因此,我们可以得出以下结论:
T2
与T1
reinterpret_cast<*T>(ptr)
并不总是等于static_cast<*T>(static_cast<void*>(ptr))
,但static_cast<>(ptr)
始终等于ptr
reinterpret_cast<>(ptr)