所以我正在阅读答案 来自“void *”的dynamic_cast 虽然你不能从一个演员 void *
到了 T *
一些回应指出有可能施展一个 T *
到了 void *
,但不要给出任何指示 为什么 你想要那样做。
这只是一个琐事,它是可能的,还是有一个合理的案例?我想到可能是为了可读性或者说清楚我们正在转换为 void *
但是考虑到了目的 dynamic_cast
,它不适合我。
就此而言,除了让我们做任何其他事情是否有任何理由 T *
成为 void *
含蓄?我见过C风格的演员阵容 void *
为了这个目的不时使用,我认为只是明确(假设我们没有像铸造那样做一些不寻常的事情 int
指针或某事)。
首先,使用时 dynamic_cast<void*>(x)
你得到一个指向第一个字节的指针 最衍生的 目的。只要静态类型 x
是多态的。
这在少数场景中很有用,其中地址用作对象标识:
- 现在,您可以完全区分指向同一对象的子对象的指针,从指向不相关的子对象的指针。
- 你现在可以走一些扭曲的图形而不需要多次访问同一个对象......这可以用来 系列化。
当然,这当然不是一个 日常使用但是在C ++中,内存地址是对象的事实上的标识符,因此从继承层次结构的任何部分访问它的机制当然对那些少数边缘情况很有用。
有一个目的,有点。它在规范中允许它的部分暗示。从N3337,第5.2.7节,第7段:
如果T是“指向cv void的指针”,则结果是指向v指向的最派生对象的指针。
那么一个 dynamic_cast<void*>(...)
真的是简写 static_cast<void*>(dynamic_cast<MostDerivedType*>(...))
。那将是有用的......有点儿。
使它有用的困难在于你不一定知道什么 MostDerivedType
是。毕竟,每个表达式可能不同。所以一旦你拥有它 void*
,你不一定有办法把它丢回来 安然。如果你猜一下 MostDerivedType
只是 static_cast
它,你 错误那么你在未定义的行为领域。而如果你做了 dynamic_cast
那种类型(然后 static_cast
至 void*
),如果它不是那种类型,它至少会返回NULL。
所以不,我会说这不是很有用。如果您希望生活在C ++的边界内并且不依赖于潜在的未定义行为,那就不是了。