【发布时间】:2019-06-04 22:11:09
【问题描述】:
在 Nicolai M. Josuttis 的“C++ 标准库”(2002 年 12 月第 10 次印刷)中,第 8.1.1 节“作为排序标准的函数对象”有 operator() 和 return 语句:
return p1.lastname()<p2.lastname() ||
(!(p2.lastname()<p1.lastname()) &&
p1.firstname()<p2.firstname());
根据我对等价的理解,这是正确的。但是同一本书的第二版(2012 年出版)已将其更改为:
return p1.lastname()<p2.lastname() ||
(p1.lastname()==p2.lastname() &&
p1.firstname()<p2.firstname());
它使用了等价和相等的混合。第 1 版的勘误表确认了第 2 版的正确性:http://www.josuttis.com/libbook/errata1_05.html(参见第 295 页,第 8.1.1 节)
为什么第一个不正确?我认为如果两个值都不在另一个之前,那么两个值是等价的,这就是第一个代码 sn-p 显示的内容。为什么第二个是正确的,即使它使用 operator== 来测试相等性,而不是等价性?
ps。第二版在第 10.1.1 节中有这一点,其章节标题与第一版相同。
【问题讨论】: