我正在处理一个特殊情况,我无法直接使用dynamic_cast
,因为该对象是void*
。是先使用static_cast
,然后使用dynamic_cast
(static_cast
)不良做法的结果?这是错的吗?
这是我正在谈论的一个例子:
MyClass* CastVoidPtr(void* pVoidPtr)
{
// casting it to MyClass so we could use dynamic_cast
MyClass* pTemp = static_cast<MyClass*>(pVoidPtr);
// returning the actual result that will make sure that we have a MyClass object or a nullptr
return dynamic_cast<MyClass*>(pTemp);
}
答案 0 :(得分:3)
这将取决于指针如何成为void*
开始。如果它被投射到void*
的类型与投射到(这里MyClass*
)相同,那么是的,这个演员阵容很好并按预期工作;
来自cppreference on static_cast
:
可以将指向
void
(可能是cv-qualified)的类型指针的prvalue转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则结果指针值不变,否则未指定。将任何指向指针的指针转换为void
并返回指向原始(或更多cv限定)类型的指针,保留其原始值。
以这种方式使用static_cast
基本上是对编译器说'#34;我知道它是这种类型 - 相信我&#34;,并且编译器有义务。
然后可以在此之后评估dynamic_cast
。它通常用于转换为更加派生的类型。在这里,你投射到相同的类型 - 它没有做任何特别有用的事情。如果类型是更加派生的类型(例如MySpecialisedClass
),那么它就没问题了。
目前,该功能可以简化为:
MyClass* CastVoidPtr(void* pVoidPtr)
{
return static_cast<MyClass*>(pVoidPtr);
}
或者只是使用裸static_cast<>
。
旁注;值得一提的是reinterpret_cast
has similar functionality;
任何指向
T1
类型对象的指针都可以转换为指向另一种类型cv T2
的对象的指针。这与static_cast<cv T2*>(static_cast<cv void*>(expression))
完全相同(这意味着如果T2
的对齐要求不比T1
更严格,则指针的值不会改变并将结果指针转换回原始类型,得到原始值。在任何情况下,如果类型别名规则允许,结果指针只能被安全地解除引用...