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
,假设 Derived
和 Base
.
之间没有虚拟继承
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_cast
从 Derived
向上转换为 Base
并从 Base
向下转换为 Derived
将 正常工作 只要继承关系不是虚拟的、明确的,并且public.
对于我正在实现的一些专门的类似分配器的东西,我想要求所有将要存储的对象共享一个公共基础 class 作为它们的第一个子对象。这允许我将单个指针保留在公共基础 class 上,作为对象开始的指示器,以及使用 static_cast
重新获得对原始对象的访问权,假设我有一些方法可以知道原始对象的类型。
具体来说,我希望以下等式始终适用于任何指针 ptr
到类型 Base
,假设 Derived
和 Base
.
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_cast
从 Derived
向上转换为 Base
并从 Base
向下转换为 Derived
将 正常工作 只要继承关系不是虚拟的、明确的,并且public.