При изучении недавнего вопроса я пришел к следующему предложению в стандарте '03 [1]:
Когда typeid применяется к lvalue выражение, тип которого является полиморфным тип класса (10.3), результат ссылается к объекту type_info, представляющему тип самого производного объекта (1.8) (то есть динамический тип), к которому значение lvalue. Если значение lvalue выражение получается путем применения унарный оператор с указателем и указатель - значение нулевого указателя (4.10), выражение типа type бросает исключение bad_typeid (18.5.3).
В частности, мне интересно узнать о последнем бите, который обеспечивает корректное поведение для результата разыменования нулевого указателя. Насколько я могу судить, это единственный раз, когда это делается [2]. В частности, dynamic_cast<T&>
не имеет специального лечения для этого случая, и это похоже на гораздо более полезный сценарий. Вдруг так считая, что dynamic_cast<T&>
уже определено как бросание исключения при определенных обстоятельствах.
Есть ли конкретная причина, что этому конкретному выражению было дано специальное лечение? Это кажется совершенно произвольным, поэтому я предполагаю, что есть некоторые конкретные варианты использования, которые они имели в виду.
[1] Аналогичное предложение существует в '11, но оно относится к выражениям glvalue, а не к выражениям lvalue.
[2] delete 0;
и dynamic_cast<T*>(0)
приближаются, но в обоих случаях вы имеете дело со значением указателя, а не с фактическим объектом.