static_cast和reinterpret_cast用于std::aligned_storage吗?

11

请问有人能解释一下关于类型转换的代码吗?具体在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]);

为什么这里使用了两个强制类型转换? 非常感谢。

Hong


1
我怀疑这是为了正确的可移植性/标准一致性所需的,因为在标准中未指定reinterpret_cast的结果。实际上,在所有或几乎所有的实现中,它们可能会执行相同的操作。 - Steve Jessop
2
在C++11中,这两者是等价的。 - Simple
@SteveJessop:我认为那就是一个答案。 - John Dibling
1
@JohnDibling:如果我确定它是正确的,那就好了(首先,reinterpret_cast对于这项工作来说是不充分的,其次,这就是示例代码使用这两个转换的原因)。如果std::aligned_storage确实给你的东西需要两次转换才能使用,那就有点糟糕了。 - Steve Jessop
我最初在cppreference的示例中使用了reinterpret_cast,但在阅读了从http://chat.stackoverflow.com/transcript/message/10437436#10437436开始的Lounge讨论和TR1时代的帖子https://dev59.com/lnNA5IYBdhLWcg3wH6EW#1082398之后,我改用了这个`static_cast`链,并加上了注释“避免正式UB”.. 但我可能过于谨慎了。如果有人发布了令人信服的答案,请随意更改回来。 - Cubbi
1个回答

5
根据标准(§ 5.2.10 reinterpret_cast, 第7节):
引用一个对象的指针可以显式转换为指向不同对象类型的指针。当类型为“指向 T1 的指针”的 prvalue v 转换为类型 “指向 cv T2 的指针”时,如果T1T2都是标准布局类型并且 T2 的对齐要求不比 T1 严格,则结果为 static_cast<cv T2*>(static_cast<cv void*>(v))将类型为“指向 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接