c – 在断言中检查static_cast vs reinterpret_cast

我看到了一些代码

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

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

最佳答案 由于reinterpret_cast< T *>(p)的行为是针对大多数用途特定的实现,因此几乎所有reinterpret_cast< T *>(p)的使用都是代码高度不可移植并且理想地避免的标志.有时reinterpret_casts无法避免,但试图在其属性上断言几乎肯定是代码试图做一些它不应该尝试的事情.

从实际的观点来看,存在许多static_cast< T *>(p),它们是允许的并且可以改变指针的地址.特别地,如果p是通过从T *到值p的隐式转换获得的,则允许static_cast< T *>(p),该值p显然是某些其他指针类型(包括void *).当隐式转换调整指针时,static_cast< T *>(p)将撤消调整.但是,该标准没有规定指针地址可以在哪些条件下改变.

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

在我看来,上面引用的ASSERT()声明:“不要使用这段代码!”

点赞