Я изучал Общая реализация неинтрузивных интеллектуальных указателей. У меня есть некоторая путаница в разделе 4. Один оператор
выражение, предоставленное в качестве аргумента для оператора typeid, оценивается только в том случае, если тип результата является lvalue типа полиморфного класса.
И соответствующий примерный код:
template<typename T>
void* startOfObject(T* p) {
void* q=static_cast<void*>(p);
typeid(q=dynamic_cast<void*>(p),*p); // This line
return q;
}
AFAIU, это означает, что q=dynamic_cast<void*>(p) будет оцениваться, если тип результата является lvalue типа полиморфного класса. Результат означает результат оценки dynamic_cast<void*>(p) (я думаю), поэтому dynamic_cast должен применяться в любом случае. В статьях говорится (как я понимаю), что если p не является полиморфным, то dynamic_cast не будет применяться, но почему? Прежде чем применять его, как можно узнать, является ли результат полиморфным или нет? Будет полезно, если кто-то подробно описывает, как будет выполняться полный оператор.
Другим утверждением является
Также существует проблема, если p является NULL - typeid будет вызывать std:: bad cast.
Проблема, которую я вижу, связана с де-ссылкой, если p - NULL, а не с typeid (хотя это может вызвать bad_typeid, но это не из-за кастинга). dynamic_cast вернет указатель NULL типа void*, если p - NULL, а typeid должен иметь возможность выводить информацию о типе. Это опечатка, или я чего-то не хватает?