根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义

As per author below first version of compare will be undefined if two pointer pointing to different array

本文关键字:数组 比较 未定义 版本 第一个 指针 如果 两个      更新时间:2023-10-16

背景:在研究入门第5版第16章第808页C++时,我发现了两种类型的比较函数。

template <typename T>  int compare(const T& v1, const T& v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
template <typename T> int compare(const T &v1, const T &v2)  
{  
if (less<T>()(v1, v2)) return -1;  
if (less<T>()(v2, v1)) return 1;  
return 0;  
}  

我们原始版本的问题在于,如果用户使用两个指针调用它,并且这些指针不指向同一个数组,那么我们的代码是未定义的。

上面的这行我不清楚。
谁能解释一下上面的行?

运算符>、>=、<和><= 在应用于不同数组的指针时调用未定义的行为,根据 C 语言标准,并由C++语言标准继承。这是一种痛苦。(== 和 != 如果指针有效,则没有未定义的行为,唯一的问题是经过一个对象末尾的指针可能与指向另一个对象开头的指针相等。例如 int a, b 和 compare &a[1] 和 &b[0](。

less(( 函数没有这个问题。它也定义了这些情况下的行为。它定义了行为,因为C++标准是这样说的,并且由标准库的实现者来使其工作。在大多数当前的实现中,less(( 与 <一样高效。>

可以通过指针指定数组索引。

array是一系列连续的存储位置。因此,对于有效和任意索引,数组的xy之间将只有以下两种关系之一:

x < y
y < x

方法 1 简单地比较了 2 个值。因此,它也可以比较 2 个任意指针。因此,可以以有效的方式比较同一数组的任何 2 个索引(指定为指针(。因此,如果参数来自同一数组,方法一将给出有效/正确/预期的结果。

如果方法 1 与任意指针一起使用,则用户必须知道该方法给出的可能结果。