Constexpr 检查两个层次相关类型之间的指针的 static_cast 是否更改了指针值

Constexpr check if static_cast of pointers between two hierarchically related types changes the pointer value

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

具体来说,我希望以下等式始终适用于任何指针 ptr 到类型 Base,假设 DerivedBase.

之间没有虚拟继承
reinterpret_cast<char *>(static_cast<Derived*>(ptr)) == reinterpret_cast<char *>(ptr)

我假设这个等式适用于给定 class 层次结构的所有有效指针, 或者它不适用于给定 class 层次结构的任何有效指针。对吗?

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

你问的是指针互换性。有一个相关的特征 std::is_pointer_interconvertible_base_of which isn't implemented yet in gcc and clang. See also the paper and issue。指针可互换类型具有相同的地址,它们的指针可以在 reinterpret_cast.

之间转换

I assume that this equation holds either for all valid pointers of a given class hierarchy, or it doesn't hold for any valid pointer of a given class hierarchy. Is that correct?

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

问题未能激发具有相同地址的要求。如果这不是必需的,static_castDerived 向上转换为 Base 并从 Base 向下转换为 Derived 正常工作 只要继承关系不是虚拟的、明确的,并且public.