`reinterpret_cast` 真的有用吗?

Is `reinterpret_cast` actually good for anything?

learned 通过 reinterpret_casting 其地址将 POD 重新解释为不同的 POD 是未定义的行为。所以我只是想知道 reinterpret_cast 的潜在用例是什么,如果它不能用于其名称所暗示的那样?

一个非常常见的用例是当您使用 C 库函数时,这些函数采用不透明的 void * 转发给回调函数。在栅栏的两边使用reinterpret_cast,可以说,保持一切正常。

有两种情况我用过reinterpret_cast:

  1. 出于序列化目的或在与遗留 API 对话时与 char* 进行转换。在这种情况下,从 char* 到对象指针的转换严格来说仍然是 UB(即使非常频繁地进行)。你实际上并不 需要 reinterpret_cast 在这里——你可以使用 memcpy 代替,但是在特定的情况下 可能 环境避免复制(但在重新解释字节首先有效的情况下,memcpy 通常也不会生成任何冗余副本,编译器足够聪明)。

  2. 转换指针 from/to std::uintptr_t 以在遗留 API 中序列化它们或对它们执行一些非指针运算。这绝对是一个奇怪的野兽并且不会经常发生(即使在低级代码中)但是考虑这样一种情况,即有人想要利用给定平台上的指针不使用最高有效位这一事实,而这些位可以因此被用来存储一些位标志。垃圾收集器实现偶尔会这样做。有时也可以使用指针的低位,如果程序员知道指针将始终对齐,例如在 8 字节边界处(因此最低三位必须为 0)。

但老实说,我不记得我实际使用过的最后一个具体、合法的情况 reinterpret_cast。肯定是很多年前了。

允许 C 和 C++ 的一致性实现通过有意义的行为来扩展 C 或 C++ 的语义,即使在标准不要求它们这样做的情况下也是如此。这样做的实现可能比不这样做的实现更适合更广泛的任务。在许多情况下,使用一致的 syntax 来指定构造,这些构造将被设计为适合低级编程任务的实现有意义且一致地处理,即使实现不适合此类用途的设计会对其进行无意义的处理。