Да, компилятор может опустить вызов dynamic_cast
согласно правилу «как будто» 1) тогда и только тогда, когда он может доказать, что единственным действительным результатом вызова является false
.Это просто.
Сложная задача - доказать, что единственным действительным результатом dynamic_cast
является false
.Вы можете доказать, что если в вашей программе нет класса, который наследовал бы от A
и B
.
Теперь я не очень разбираюсь в этой части, но я думаю, что вы можете сделать это, когда высоздать двоичный файл и иметь все типы в вашей программе, только если это исполняемый файл (не библиотека) и только если программа не динамически связывается с другими библиотеками.
1) dynamic_cast
на указатели не имеет побочного эффекта, он не выбрасывает