具有相同地址的指针相等性测试产生错误

pointer equality test with same address yields false

为什么这个指针比较不起作用?

// in handleSlot()...
void* ptr1 = m_expected; // defined as SimpleBase*
void* ptr2 = sender(); // defined as QObject*
if (ptr1 != ptr2)
    return; // this should not be reached, since the debugger shows ptr1 and ptr2 are the same

这里的背景是我有一个模板化类型,它继承自 QObjectT,其中 TSimpleBase 的子类。由于不知道哪个模板实例化触发了slot,所以这里不能做动态转换,直接比较同类型的指针。

我也尝试使用 reinterpret_cast<uintptr_t> 比较指针地址,但是当我这样做时很奇怪,它们产生了不同的整数。

我能够通过向信号和槽添加参数使其通过 const SimpleBase *this 来解决该问题,指针比较就是这样工作的。但我很好奇是否有一种方法可以按原样比较这些指针,使用 sender() 而不是传递额外的参数?

看来您可以 dynamic_cast<SimpleType*>(sender())dynamic_cast<QObject*>(m_expected) 假设两者都是唯一的并且具有 virtual 功能。多重继承的基确实有不同的实际地址,你不能总是使用 void* 来比较它们是否相等。