Я изучал Общая реализация неинтрузивных интеллектуальных указателей. У меня есть некоторая путаница в разделе 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
должен иметь возможность выводить информацию о типе. Это опечатка, или я чего-то не хватает?