gpt4 book ai didi

c++ - constexpr 检查两个层次相关类型之间指针的 static_cast 是否更改指针值

转载 作者:行者123 更新时间:2023-12-03 07:12:05 26 4
gpt4 key购买 nike

对于我正在实现的一些专门的类似分配器的东西,我想要求所有将要存储的对象共享一个公共(public)基类作为它们的第一个子对象。这使我可以将公共(public)基类中的单个指针作为对象开始的指示符以及使用 static_cast 重新获得对原始对象的访问权。 ,假设我有办法知道原始对象的类型。
具体来说,我希望以下等式始终适用于任何指针 ptr到类型 Base , 假设 Derived 之间没有虚拟继承和 Base .

reinterpret_cast<char *>(static_cast<Derived*>(ptr)) == reinterpret_cast<char *>(ptr)
我假设这个等式适用于给定类层次结构的所有有效指针,
或者它不适用于给定类层次结构的任何有效指针。那是对的吗?
因此,应该可以在编译时进行检查,甚至不知道 ptr 的运行时值。 .那么有没有 constexpr检查 static_cast 是否存在的方法两个相关类型之间改变指针值?上面的相等性似乎是 Not Acceptable ,因为我发现没有 constexpr 方法来创建测试指针。

最佳答案

您要问的是指针互转换性。有一个相关性状 std::is_pointer_interconvertible_base_of 在 gcc 和 clang 中尚未实现。另见 the paperissue .指针可互换类型具有相同的地址,并且它们的指针可以在 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只要继承关系不是虚拟的、明确的和公开的,它就可以工作。

关于c++ - constexpr 检查两个层次相关类型之间指针的 static_cast 是否更改指针值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64544862/

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