У этого есть цель, вроде. На это намекает та часть спецификации, которая это позволяет. От 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 ++ и не полагаться на потенциально неопределенное поведение.