【发布时间】:2014-03-01 16:12:19
【问题描述】:
我看到有人建议使用 static_cast<SomeType*>(static_cast<void*>(p)) 而不是重新解释强制转换。
我不明白为什么这样更好,有人可以解释一下吗?
为了论证,这里是一个需要 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));
编辑:我最初用 在 cmets 部分“asdf”建议在这里使用 static_cast 而不是 reinterpret_cast http://blogs.msdn.com/b/vcblog/archive/2014/02/04/challenge-vulnerable-code.aspx 开始我的问题,但回想起来,我的问题来自那里无关紧要。
【问题讨论】:
-
reinterpret_cast 几乎总是由实现定义,发生的事情并不总是保证是可移植的。
-
@PlasmaHH 这有点误导。
reinterpret_cast具有非常明确的语义,它们只是非常有限。但是在这种情况下,语义似乎被覆盖了(我没有查看代码就这么说了,基于 OP 的lpOverlapped声明)。但阅读 asdf 的评论则完全不同。 -
当你从一个指针类型转换为另一个指针类型时,
reinterpret_cast在 C++11 中是根据static_cast<cv ToType*>(static_cast<cv void*>(p))指定的。它们都是一样的。 -
另一方面,如果您想确保转换是安全的,您可以使用something like this,然后使用
pointer_cast<MyObject>(lpOverlapped)。
标签: c++ casting reinterpret-cast static-cast