Herb Sutter 在他对“宇宙飞船”操作员的提议(第 2.2.2 节,第 12 页底部)中说:
基于所有内容
<=>
及其返回类型:此模型具有主要优势,与以前的 C++ 提案和其他语言的功能相比,此提案有一些独特之处:[...]
(6)效率,包括最终实现比较的零开销抽象:绝大多数比较总是单通的。唯一的例外是在同时支持部分排序和相等的类型的情况下
<=
生成。>=
For<
,single-pass 对于实现零开销原则以避免重复相等比较是必不可少的,例如 forstruct Employee { string name; /*more members*/ };
used instruct Outer { Employeee; /*more members*/ };
- 今天的比较违反了零开销抽象,因为operator<
onOuter
执行冗余相等比较,因为它执行if (e != that.e) return e < that.e;
遍历相等前缀e.name
两次(如果名称相等,则遍历其他成员的相等前缀Employee
两倍),这通常不能被优化掉。正如 Kamiński 所指出的,零开销抽象是 C++ 的支柱,第一次实现它以进行比较是这种基于<=>
.
但随后他给出了这个例子(第 1.4.5 节,第 6 页):
class PersonInFamilyTree { // ...
public:
std::partial_ordering operator<=>(const PersonInFamilyTree& that) const {
if (this->is_the_same_person_as ( that)) return partial_ordering::equivalent;
if (this->is_transitive_child_of( that)) return partial_ordering::less;
if (that. is_transitive_child_of(*this)) return partial_ordering::greater;
return partial_ordering::unordered;
}
// ... other functions, but no other comparisons ...
};
会定义operator>(a,b)
为a<=>b > 0
不会导致大量开销吗?(尽管形式与他讨论的不同)。该代码将首先测试是否相等,然后测试 ,less
最后greater
测试 ,而不是仅直接测试greater
.
我在这里错过了什么吗?