разыменование нулевого указателя в typeid

Исследуя недавний вопрос, я натолкнулся на следующий пункт в стандарте '03 [1]:

Когда typeid применяется к lvalue выражение, тип которого является полиморфным тип класса (10.3), результат относится в объект type_info, представляющий тип наиболее производного объекта (1.8) (то есть динамический тип), к которому lvalue ссылается. Если lvalue выражение получается применением унарный оператор * на указатель и указатель является значением нулевого указателя (4.10) выражение typeid бросает исключение bad_typeid (18.5.3).

В частности, меня интересует последний бит, который обеспечивает четко определенное поведение для результата разыменования нулевого указателя. Насколько я могу судить, это единственный раз, когда это делается [2]. В частности, dynamic_cast не имеет специальной обработки для этого случая, и это кажется гораздо более полезным сценарием. Вдвойне учитывая, что dynamic_cast уже определен как выдача исключения при определенных обстоятельствах.

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


[1] Аналогичное предложение существует в '11, но оно относится к выражениям glvalue, а не к выражениям lvalue.

[2] delete 0; и dynamic_cast (0) приближаются, но в обоих случаях вы имеете дело со значением указателя, а не с реальным объектом.

16
задан Dennis Zickefoose 17 May 2011 в 09:14
поделиться