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 быть как-то связана с этим?

0 ответов

Другие вопросы по тегам