通常只能比较C ++中的指针是否相等。相比之下,只允许两个指向同一完整对象(例如数组元素)的子对象的指针进行小于比较。
因此给定T * p, * q
,通常评估p < q
是非法的。
标准库包含函子类模板std::less<T>
等,这些模板包装了内置运算符<
。但是,该标准对指针类型(20.8.5 / 8)有这样的说法:
对于模板
greater
,less
,greater_equal
和less_equal
,即使内置运算符<
,>
,<=
,任何指针类型的特殊化也产生总顺序,>=
否。如何实现?甚至可以实现吗?
我看了GCC 4.7.2和Clang 3.2,它们根本不包含指针类型的any
专门化。他们似乎依赖<
在所有受支持的平台上无条件有效。通常只能比较C ++中的指针是否相等。相比之下,仅允许指向同一完整对象的子对象的两个指针进行小于比较(例如,数组...
指针可以完全排序吗?不在可移植的标准C ++中。那是为什么该标准需要实施来解决问题,而不是您。对于任何给定的指针表示,应该是可能的定义任意的总排序,但是如何执行将取决于指针的表示形式。
是否有可能在指针未形成全局总顺序的目标上实现标准库?
在大多数具有平坦地址空间的平台上,它们可以简单地在指针之间进行数值比较。在不可能做到这一点的平台上,实施者必须想出其他方法来建立要在std::less
中使用的总订单,但是他们可能会为<
使用更有效的方法,因为它的功能较弱保证。
问题是分段体系结构,其中内存地址包含两个部分:段和偏移量。将这些片段转换为某种线性形式是“足够容易的”,但这需要额外的代码,因此决定不对operator<
施加这种开销。对于分段架构,operator<
可以简单地比较偏移量。 Windows的早期版本中存在此问题。
我认为此讨论中缺少一个更深层的概念,即指针出处