Различие в поведении при использовании dynamic_cast со ссылкой и указателями

Я проверил бы и IP и Агент пользователя, чтобы видеть, изменяются ли они

if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
    || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
    //Something fishy is going on here?
}
39
задан sharptooth 14 August 2009 в 11:09
поделиться

4 ответа

Да, это правильное поведение. Причина в том, что у вас может быть нулевой указатель, но не пустая ссылка - любая ссылка должна быть привязана к объекту.

Поэтому, когда dynamic_cast для типа указателя не работает, он возвращает нулевой указатель, и вызывающий может проверить это , но когда он не работает для ссылочного типа, он не может вернуть пустую ссылку, поэтому исключение - единственный разумный способ сообщить о проблеме.

66
ответ дан 27 November 2019 в 02:14
поделиться

См. Стандарт C ++, раздел 5.2.7 / 9:

9 Значение неудачного приведения к тип указателя - значение нулевого указателя требуемого типа результата. Неудачный приведение к ссылочному типу бросает bad_cast (18.5.2).

Относительно того, почему - это слова Страуструпа из книги D&E, раздел 14.2.2:

Я использую эталонное приведение, когда мне нужно предположение о ссылочном типе проверил и считаю это неудачным для мое предположение ошибочно. Если вместо этого Я хочу выбрать среди правдоподобных альтернативы, я использую приведение указателя и проверьте результат.

25
ответ дан 27 November 2019 в 02:14
поделиться

Да, это так. Поскольку dynamic_cast не может вернуть NULL для неудачного преобразования ссылки, исключение - единственный выход.

То есть ссылка не может быть NULL, поэтому нет ничего подходящего для возврата.

5
ответ дан 27 November 2019 в 02:14
поделиться

Да, 5.2.7 / 9

Значение неудачное приведение к типу указателя - это значение нулевого указателя требуемого типа результата. Неудачное приведение к ссылочному типу вызывает bad_cast (18.5.2).

8
ответ дан 27 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: