是UB将T*转换为uintptr_t,将uintptr_t重新转换为void*,然后将void*静态转换回T*吗?

Tel*_*ope 6 c++ pointers static-cast memory-address reinterpret-cast

我正在编写一个 C++ 标记指针。我有一个问题,我用来实现其基本功能的操作是否会导致未定义的行为:

  • 当给定一个指针构造一个标记指针时T*,我reinterpret_cast将指针指向 a uintptr_t。这允许我对内存地址执行按位操作,这是添加/提取/检查标签所必需的。
  • 当用户请求返回原始指针时,我将 强制reinterpret_cast转换uintptr_t为 a void*(删除标签后)。如果需要指向特定类型的指针,我会将其接受 (void*假设确实是标记指针中保存的类型)。static_castT*T

因此,总而言之,我正在对 a 执行以下转换T*

  • reinterpret_cast荷兰国际集团T*到auintptr_t
  • 稍后,reinterpret_cast将其uintptr_t转为 a void*,并可能static_cast将其void*转回 a T*

这是否会导致未定义的行为?此外,我是否在预期的用例中正确使用了reinterpret_cast和?static_cast