我看到有人建议使用static_cast<SomeType*>(static_cast<void*>(p))
而不是reinterpret_cast进行强制类型转换。
我不明白这样做为什么更好,有人可以解释一下吗?
为了举例说明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));
编辑:我最初在评论部分中提到,在此处使用static_cast而不是reinterpret_cast,http://blogs.msdn.com/b/vcblog/archive/2014/02/04/challenge-vulnerable-code.aspx,但是回想起来,我的问题来源并不重要。
reinterpret_cast
有非常明确定义的语义,只是非常有限。但在这种情况下,语义似乎已经被覆盖了(我没有查看代码,基于 OP 对lpOverlapped
的陈述)。但阅读 asdf 的评论则是完全不同的情况。 - Konrad Rudolphreinterpret_cast
的规定与static_cast<cv ToType*>(static_cast<cv void*>(p))
相同。这两者是相同的。 - Simplepointer_cast<MyObject>(lpOverlapped)
。 - Simple