我不明白为什么这样更好,有人可以解释一下吗?
为了论证,这里是一个需要reinterpret_cast的示例场景:
DWORD lpNumberOfBytes; ULONG_PTR lpCompletionKey; LPOVERLAPPED lpOverlapped; GetQueuedCompletionStatus(myHandle,&lpNumberOfBytes,&lpCompletionKey,&lpOverlapped,0); if(lpCompletionKey == myCustomHandlerKey){ auto myObject = reinterpret_cast<MyObject*>(lpOverlapped); //i know this is really a MyObject }
这是我听到的建议:
auto myObject = static_cast<MyObject*>(static_cast<void*>(lpOverlapped));
编辑:我原本开始我的问题在评论部分“asdf”建议在这里使用static_cast而不是reinterpret_cast http://blogs.msdn.com/b/vcblog/archive/2014/02/04/challenge-vulnerable-code.aspx,但回想起我的问题来自那里的事实是无关紧要的.
解决方法
与您的示例相关的转换是/ 7:
A pointer to an object can be explicitly converted to a pointer to a different object type. When a prvalue
v
of type “pointer toT1
” is converted to the type “pointer to cvT2
”,the result isstatic_cast<cv T2*>(static_cast<cv void*>(v))
if bothT1
andT2
are standard-layout types … and the alignment requirements ofT2
are no stricter than those ofT1
. [emphasis mine]
任何其他指向对象类型的指针的转换结果是“未指定”.1
这是reinterpret_cast危险的两个原因之一:它的转换仅为指向对象类型的指针子集定义良好,编译器通常不提供有关意外误用的诊断.
第二个原因是编译器甚至不检查您尝试执行的映射是否合法,以及将执行多个(语义上完全不同的)映射中的哪一个.
最好明确并告诉编译器(和读者)您想要执行的转换.也就是说,asdf的评论不太正确,因为并非您通过reinterpret_cast执行的所有转换都等同于使用static_cast< void *>然后是static_cast到目标类型.
1旁白:简而言之(略微简化),“standard layout type”是一种类型(或类型数组),它没有虚函数或混合成员可见性,其所有成员和基础也是标准布局.类型的alignment是对它可能位于的存储器中的地址的限制.例如,许多机器要求双精度在可被8整除的地址处对齐.