, Если объявлена ​​функция, возвращающая 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) подходите ближе, но в обоих случаях вы имеете дело со значением указателя, а не с реальным объектом.

Ответы на вопрос(1)

Ваш ответ на вопрос