只有在定义了其他比较运算符(而不仅仅是 < 一个)的情况下,我们才希望减少 {} 的实际情况是什么?
并非 Ranges 库的所有内容都纯粹基于“实用”的内容。其中大部分是关于使语言和库具有逻辑意义。
概念作为语言特征使标准库有机会定义有意义的对象特征组合。从纯粹实用的角度来说,说一个类型有 anoperator<
是有用的,即告诉您它可以使用哪些操作。但它并没有真正说明类型的任何意义。
如果一个类型是完全有序的,那么这在逻辑上意味着您可以使用任何比较运算符来比较该类型的两个对象。总序的思想下,a < b
和b > a
都是等价的语句。因此,如果代码仅限于提供总顺序的类型,则应该允许该代码使用任一语句。
ranges::less::operator()
不使用除 之外的任何运算符<
。但是此功能仅限于对totally_ordered
概念建模的类型。存在此约束是因为这ranges::less
就是:比较完全有序的类型。它可以有一个更窄的约束,但这将抛弃全排序提供的任何意义。
它还可以防止您向用户公开任意实现细节。例如,假设您有一个采用某种类型的模板,T
并且您想T
在ranges::less
基于 - 的操作中使用。如果您将此模板限制为仅具有一个operator<
,那么您已有效地将您的实现置于约束中。您不再有实现在ranges::greater
内部切换的自由。然而,如果你设置std::totally_ordered
了约束,你就会让用户清楚他们需要做什么,同时让你自己可以自由地使用你需要的任何函子。
并且由于operator<=>
存在并且可以很容易地在一个函数中实现排序运算符,因此没有实际的缺点。好吧,除了必须在 C++17 和 C++20 上编译的代码。
从本质上讲,您不应该只写operator<
开头就编写“有序”的类型。