(与我之前的问题有关)
在 QT 中,QMap
文档说:
QMap 的键类型必须提供
operator<()
指定总顺序。
但是,在 中qmap.h
,它们似乎使用类似于 的东西std::less
来比较指针:
/*
QMap uses qMapLessThanKey() to compare keys. The default
implementation uses operator<(). For pointer types,
qMapLessThanKey() casts the pointers to integers before it
compares them, because operator<() is undefined on pointers
that come from different memory blocks. (In practice, this
is only a problem when running a program such as
BoundsChecker.)
*/
template <class Key> inline bool qMapLessThanKey(const Key &key1, const Key &key2)
{
return key1 < key2;
}
template <class Ptr> inline bool qMapLessThanKey(const Ptr *key1, const Ptr *key2)
{
Q_STATIC_ASSERT(sizeof(quintptr) == sizeof(const Ptr *));
return quintptr(key1) < quintptr(key2);
}
他们只是将指针转换为quintptr
s (这是 的 QT 版本uintptr_t
,即能够存储指针的无符号整数)并比较结果。
以下类型指定了一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:
uintptr_t
你认为这种qMapLessThanKey()
on 指针的实现好吗?
当然,整数类型有一个总顺序。但我认为这不足以得出此操作定义了指针的总顺序的结论。
我认为只有在没有指定 AFAIKp1 == p2
的情况下,它才是正确的。quintptr(p1) == quintptr(p2)
作为这种情况的反例,想象一个使用 40 位指针的目标;它可以将指针转换为quintptr
,将 40 个最低位设置为指针地址,并使 24 个最高位保持不变(随机)。这足以尊重quintptr
和指针之间的可转换性,但这并没有定义指针的总顺序。
你怎么看?