gpt4 book ai didi

c++ - 在断言中检查 static_cast 与 reinterpret_cast

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:35 24 4
gpt4 key购买 nike

我看到了一些代码

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

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

最佳答案

由于 reinterpret_cast<T*>(p) 的行为是大多数用途的特定实现,几乎所有 reinterpret_cast<T*>(p) 的用途是代码高度不可移植且理想情况下应避免的标志。有时reinterpret_cast s 是不可避免的,但尝试断言它的属性几乎肯定是代码正在尝试做它不应该尝试的事情的标志。

从实用的角度来看,有很多static_cast<T*>(p)哪些是允许的,哪些可能会改变指针的地址。特别是,static_cast<T*>(p)如果 p 则允许通过从 T* 的隐式转换获得到值 p这是[显然]一些其他指针类型(包括 void* )。当隐式转换调整指针时,static_cast<T*>(p)将撤消调整。但是,该标准并未指定在何种情况下指针地址可能会发生变化。

似乎断言想要防止实现需要更改指针地址的情况。由于没有标准保证转换为基类的指针的地址何时发生变化,也没有什么reinterpret_cast<T*>(p)。确实如此,不可能说出这个断言的作者的想法。不管是什么,都不能保证 guard 会防范任何预期的事情。

在我心中ASSERT()上面引用的状态:“不要使用此代码!”

关于c++ - 在断言中检查 static_cast 与 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21082031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com