在断言中检查static_cast vs reinterpret_cast

时间:2014-01-13 00:13:40

标签: c++ casting static

我看到了一些代码

ASSERT(static_cast<MyClass*>(p) == reinterpret_cast<MyClass*>(p))

我认为p是一个基类型指针。 这个断言的目的是什么?是否检查MyClass不是某些多重继承层次结构的一部分(或任何会导致已知强制转换更改p的地址值的东西)?

1 个答案:

答案 0 :(得分:2)

由于reinterpret_cast<T*>(p)的行为是针对大多数用途的特定实现,因此几乎所有reinterpret_cast<T*>(p)的使用都表明代码非常不便携,并且理想情况下可以避免使用。有时reinterpret_cast无法避免,但试图在其属性上断言几乎肯定是代码试图做一些不应该尝试的事情。

从实际的角度来看,有许多static_cast<T*>(p)是允许的,可能会改变指针的地址。特别是,如果通过从static_cast<T*>(p)到值p的隐式转换获得T*,则允许p,这显然是某些其他指针类型(包括{{} 1}})。当隐式转换调整指针时,void*将撤消调整。但是,该标准没有规定指针地址可能在哪些条件下发生变化。

似乎断言想要防止实现需要更改指针地址的情况。由于没有标准保证何时转换为基类的指针的地址发生变化,static_cast<T*>(p)发生了什么变化,因此无法确定这个断言的作者的想法。无论是什么,都不能保证警卫会防范任何意图。

在我看来,上面引用的reinterpret_cast<T*>(p)指出:“不要使用此代码!”