运算符<(小于)指针是否一致?

has*_*rsn 5 c++ pointers

注意:这个问题与总订单无关.可以使用获得相同类型的指针的总顺序std::less.

据此,如果将两个指针指向operator<不同的分配,则不允许比较两个指针.

它在哪种意义上是不允许的?是实现定义,未指定还是未定义的行为?

我想我在某个地方看到它没有说明.不需要实现来记录行为是什么,但必须有一些行为.所以这意味着,比较任何两个指针仍然是合法的,但不一定会产生总订单.这是否意味着,当两次比较相同的两个指针时,我们仍然必须得到一致的结果?一般情况是:在应用程序中两次调用相同的未指定行为总是会产生相同的结果吗?

int i1, i2;
int* a = &i1;
int* b = &i2;
bool b1 = a < b; // unspecified, right?
bool b2 = a < b;
assert(b1 == b2); // Is this guaranteed to be true?
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 7

比较两个不相关的指针(即指针不指向同一内存,或不指向同一“数组”的不同部分)只能使用等式==和不等式来完成!=。所有其他比较均未指定

如果你有两个指针指向同一个地方,或者在同一个数组中,那么你可以使用相对运算符来比较它们。

所以如果你有例如

int* p1 = new int[10];
int* p2 = new int[5];
Run Code Online (Sandbox Code Playgroud)

只能使用==!=来比较指针p1p2

但是如果你有

int a = new int[10];
int* p1 = &a[0];
int* p2 = &a[3];
Run Code Online (Sandbox Code Playgroud)

那么你也可以使用<and >(当然还有<=and >=)来比较p1p2

  • 来自链接的 SO 答案 - “但是,您可以使用 std::less 和其他关系比较函数对象来比较任何两个指针。结果是实现定义的,但可以保证存在总排序。” (3认同)