所以我正在从"void*"中读取dynamic_cast的答案,虽然你不能从一个响应void *转换为T *几个响应,但指出可以将一个转换T *为a void *,但是不要给出任何指示为什么你'我想这样做.
这只是一个琐事,它是否可能,或者是否有意义?我想也许是为了可读性或明确表示我们正在转换为a void *,但鉴于其目的dynamic_cast,它并不适合我.
对于这个问题,是没有任何理由做其他任何事情比让T *变得void *含蓄?void *为了这个目的,我已经看过不时使用C风格的强制转换,我认为只是为了明确(假设我们没有做一些不寻常的事情,比如投射int到指针或其他东西).
Mat*_* M. 10
首先,在使用时,dynamic_cast<void*>(x)您将获得指向最派生对象的第一个字节的指针.只要静态类型x是多态的.
这在少数场景中很有用,其中地址用作对象标识:
当然,这肯定不是日常使用,但在C++中,内存地址是对象的事实上的标识符,因此从继承层次结构的任何部分访问它的机制当然对那些少数边缘情况很有用.
这有一个目的,有点.它在规范中允许它的部分暗示.从N3337,第5.2.7节,第7段:
如果T是"指向cv void的指针",则结果是指向v指向的最派生对象的指针.
所以a dynamic_cast<void*>(...)真的是简写static_cast<void*>(dynamic_cast<MostDerivedType*>(...)).那将是有用的......有点儿.
使它有用的困难在于你不一定知道它是什么MostDerivedType.毕竟,每个表达式可能不同.因此,一旦你将它作为一个void*,你就不一定有办法安全地将其抛回.如果你猜测MostDerivedType并且只是static_cast它,而你错了,那么你就处于未定义的行为之中.然而,如果你执行该dynamic_cast类型(然后static_cast到void*),如果它不是那种类型,它将至少返回NULL.
所以不,我会说这不是很有用.如果您希望生活在C++的边界内而不依赖于潜在的未定义行为,那就不是了.