如何对指针进行完全排序?

问题描述 投票:22回答:5

通常只能比较C ++中的指针是否相等。相比之下,只允许两个指向同一完整对象(例如数组元素)的子对象的指针进行小于比较。

因此给定T * p, * q,通常评估p < q是非法的。

标准库包含函子类模板std::less<T>等,这些模板包装了内置运算符<。但是,该标准对指针类型(20.8.5 / 8)有这样的说法:

对于模板greaterlessgreater_equalless_equal,即使内置运算符<><=,任何指针类型的特殊化也产生总顺序,>=否。

如何实现?甚至可以实现吗?

我看了GCC 4.7.2和Clang 3.2,它们根本不包含指针类型的any

专门化。他们似乎依赖<在所有受支持的平台上无条件有效。

通常只能比较C ++中的指针是否相等。相比之下,仅允许指向同一完整对象的子对象的两个指针进行小于比较(例如,数组...

c++ pointers predicate standard-library
5个回答
16
投票

指针可以完全排序吗?不在可移植的标准C ++中。那是为什么该标准需要实施来解决问题,而不是您。对于任何给定的指针表示,应该是可能的定义任意的总排序,但是如何执行将取决于指针的表示形式。


10
投票

是否有可能在指针未形成全局总顺序的目标上实现标准库?


4
投票

在大多数具有平坦地址空间的平台上,它们可以简单地在指针之间进行数值比较。在不可能做到这一点的平台上,实施者必须想出其他方法来建立要在std::less中使用的总订单,但是他们可能会为<使用更有效的方法,因为它的功能较弱保证。


3
投票

问题是分段体系结构,其中内存地址包含两个部分:段和偏移量。将这些片段转换为某种线性形式是“足够容易的”,但这需要额外的代码,因此决定不对operator<施加这种开销。对于分段架构,operator<可以简单地比较偏移量。 Windows的早期版本中存在此问题。


0
投票

我认为此讨论中缺少一个更深层的概念,即指针出处

© www.soinside.com 2019 - 2024. All rights reserved.