Я проверил бы и IP и Агент пользователя, чтобы видеть, изменяются ли они
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
Да, это правильное поведение. Причина в том, что у вас может быть нулевой указатель, но не пустая ссылка - любая ссылка должна быть привязана к объекту.
Поэтому, когда dynamic_cast для типа указателя не работает, он возвращает нулевой указатель, и вызывающий может проверить это , но когда он не работает для ссылочного типа, он не может вернуть пустую ссылку, поэтому исключение - единственный разумный способ сообщить о проблеме.
См. Стандарт C ++, раздел 5.2.7 / 9:
9 Значение неудачного приведения к тип указателя - значение нулевого указателя требуемого типа результата. Неудачный приведение к ссылочному типу бросает bad_cast (18.5.2).
Относительно того, почему - это слова Страуструпа из книги D&E, раздел 14.2.2:
Я использую эталонное приведение, когда мне нужно предположение о ссылочном типе проверил и считаю это неудачным для мое предположение ошибочно. Если вместо этого Я хочу выбрать среди правдоподобных альтернативы, я использую приведение указателя и проверьте результат.
Да, это так. Поскольку dynamic_cast
не может вернуть NULL для неудачного преобразования ссылки, исключение - единственный выход.
То есть ссылка не может быть NULL, поэтому нет ничего подходящего для возврата.
Да, 5.2.7 / 9
Значение неудачное приведение к типу указателя - это значение нулевого указателя требуемого типа результата. Неудачное приведение к ссылочному типу вызывает bad_cast (18.5.2).