Ответ 1
Он не может дать ошибку времени компиляции, потому что отношение Base-Derived может существовать во время выполнения в зависимости от адреса вызываемых указателей.
static_cast
всегда преуспевает, но поднимет undefined -behavior, если вы не нарисуете правильный тип. dynamic_cast
может выйти из строя или нет, фактически сообщив вам, пытаетесь ли вы применить правильный тип или нет.
Итак, по-моему, static_cast
следует использовать для понижения, только если проект может установить, что такая возможность существует. Хорошим примером этого является CRTP. Поэтому в некоторых ситуациях это логично, но старайтесь избегать этого, поскольку это undefined -behavior.
RTTI не требуется для static_cast
, который может сделать его теоретически быстрее, но я буду в любое время торговать a dynamic_cast
против поведения undefined, который может вызвать static_cast
!