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