请问有人能解释一下关于类型转换的代码吗?具体在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
请问有人能解释一下关于类型转换的代码吗?具体在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
reinterpret_cast
, 第7节):T1
的指针”的 prvalue v
转换为类型 “指向 cv T2
的指针”时,如果T1
和T2
都是标准布局类型并且 T2
的对齐要求不比 T1
严格,则结果为 static_cast<cv T2*>(static_cast<cv void*>(v))
。将类型为“指向 T1
的指针”的 prvalue 转换为类型“指向 T2
的指针”(其中 T1
和T2
是对象类型,且 T2
的对齐要求不比 T1
严格)并将其转换回原始类型会产生原始指针值。任何其他此类指针转换的结果均未指定。
所以,我们得出以下结论:
reinterpret_cast<*T>(ptr)
相当于 static_cast<*T>(static_cast<void*>(ptr))
static_cast<>(ptr)
并不总是等于 ptr
,但是 reinterpret_cast<>(ptr)
总是等于 ptr
reinterpret_cast
reinterpret_cast
的结果。实际上,在所有或几乎所有的实现中,它们可能会执行相同的操作。 - Steve Jessopreinterpret_cast
对于这项工作来说是不充分的,其次,这就是示例代码使用这两个转换的原因)。如果std::aligned_storage
确实给你的东西需要两次转换才能使用,那就有点糟糕了。 - Steve Jessopreinterpret_cast
,但在阅读了从http://chat.stackoverflow.com/transcript/message/10437436#10437436开始的Lounge讨论和TR1时代的帖子https://dev59.com/lnNA5IYBdhLWcg3wH6EW#1082398之后,我改用了这个`static_cast`链,并加上了注释“避免正式UB”.. 但我可能过于谨慎了。如果有人发布了令人信服的答案,请随意更改回来。 - Cubbi