首页 > 解决方案 > constexpr 检查两个层次相关类型之间指针的 static_cast 是否更改指针值

问题描述

对于我正在实现的一些专门的类似分配器的东西,我想要求所有将要存储的对象共享一个公共基类作为它们的第一个子对象。这使我可以将公共基类的单个指针作为对象开始的指示符,并使用 重新获得对原始对象的访问权限static_cast,假设我有某种方法可以知道原始对象的类型。

具体来说,我希望以下等式始终适用于任何指向ptr type的指针,假设andBase之间没有虚拟继承。DerivedBase

reinterpret_cast<char *>(static_cast<Derived*>(ptr)) == reinterpret_cast<char *>(ptr)

我假设这个等式要么适用于给定类层次结构的所有有效指针,要么不适用于给定类层次结构的任何有效指针。那是对的吗?

因此,该检查应该可以在编译时进行,甚至不知道ptr. 那么有没有一种constexpr方法可以检查static_cast两个相关类型之间的 a 是否改变了指针值?上面的相等性似乎是不可接受的,因为我发现没有 constexpr 方法来创建测试指针。

标签: c++language-lawyerstatic-cast

解决方案


您要问的是指针互转换性。有一个相关的特性std::is_pointer_interconvertible_base_of在 gcc 和 clang 中还没有实现。另见论文问题。指针可互换类型具有相同的地址,并且它们的指针可以在reinterpret_cast.

我假设这个等式要么适用于给定类层次结构的所有有效指针,要么不适用于给定类层次结构的任何有效指针。那是对的吗?

正如您已经指出的,虚拟继承会阻止这一点,但标准布局标准的失败也是如此。如果Derived有多个基类,并且Base不是第一个,则失败。

该问题未能激发具有相同地址的要求。如果这不是必需的,那么只要继承关系不是虚拟的、明确的和公共的,从tostatic_cast向上转换和从to向下转换就可以工作。DerivedBaseBaseDerived


推荐阅读