注意:这个问题与总订单无关.可以使用获得相同类型的指针的总顺序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)
比较两个不相关的指针(即指针不指向同一内存,或不指向同一“数组”的不同部分)只能使用等式==和不等式来完成!=。所有其他比较均未指定。
如果你有两个指针指向同一个地方,或者在同一个数组中,那么你可以使用相对运算符来比较它们。
所以如果你有例如
int* p1 = new int[10];
int* p2 = new int[5];
Run Code Online (Sandbox Code Playgroud)
您只能使用==和!=来比较指针p1和p2。
但是如果你有
int a = new int[10];
int* p1 = &a[0];
int* p2 = &a[3];
Run Code Online (Sandbox Code Playgroud)
那么你也可以使用<and >(当然还有<=and >=)来比较p1和p2