C++, что может сделать type_info::hash_code разным для двух (предположительно) одинаковых объектов
После попытки отладки неудачного динамического даункадинга я в конечном итоге обнаружил, что причина, вероятно, заключается в следующем: type_info::hash_code для типа, к которому он приводится, не совпадает в зависимости от того, где в коде он вызывается. type_info::name остается точно таким же, хотя. К сожалению, я не могу воспроизвести поведение в минимальном примере, так как оно появляется в довольно запутанном контексте. Поэтому я в основном ищу подсказки о том, что может быть причиной такого поведения, и, следовательно, какое направление я могу предпринять, чтобы решить эту проблему.
Короче говоря, если связано, тип выглядит так (РЕДАКТИРОВАНИЕ):
class A {...}
template < template <class> class>
class B : virtual public A {...}
template < template <class> class>
class C : virtual public A {...}
template < template <class> class>
class D : public B, public C {...}
template <class>
class E {...}
Проблема выглядит так:
D<E>* d = build_d();
B<E>* b = d;
A* a = d;
dynamic_cast<D<E>*>(b);//returns correct pointer
dynamic_cast<D<E>*>(a);//returns 0, and really shouldn't !!
typeid(B<E>).hash_code();//differing depending where in the code this is called
Вызовы type_info:: hash_code выполняются внутри разных библиотек (моих). После копания я обнаружил опцию компилятора -rdynamic с GCC (даже если я использую Clang). Я не уверен, может ли это быть как-то связано с моей проблемой.
РЕДАКТИРОВАТЬ: я в конце концов нашел хорошую подсказку. К сожалению, пока нет решения. Похоже, проблема может быть связана с Qt в конце.
Проблема возникает в слоте функции. Когда интервал вызывается сигналом, динамическое вещание завершается неудачно. Но если я вместо этого вручную вызову слот (например, в main), это будет успешно. И если вручную вызвать слот, а затем запустить его по сигналу, это тоже успешно. Для сигнала нет аргументов, и содержимое слота было "нейтрализовано" и не зависит от каких-либо параметров. 99,99% уверены, что проблема не в ошибке алгоритма распределения.
Похоже, qt_static_metacall при вызове слота как-то теряет след свойств приведения. Может ли связанный с этим компиляция moc быть как-то связана с этим?