将 "operator>" 委托给 "operator<" 是一种错误的形式吗?

Is it bad form to have "operator>" delegate to "operator<"?

我在最近的一个程序中写过这个:

friend bool operator<(const MyClass& a, const MyClass& b) {
    // Lots of comparison code here
}

friend bool operator>(const MyClass& a, const MyClass& b) {
    return b < a;
}

当我 运行 程序时它工作正常,但这是错误的形式吗?有什么理由我不应该这样做吗?或者有什么我应该做的吗?

通常我会把operator<operator>完全分开写,但是因为operator<中的代码很长,所以我决定走这条捷径。

另请注意,速度在此程序中至关重要。

用小于号定义比较运算符是很常见的,以避免一遍又一遍(或copy/pasting)编写相同的代码,这是错误的来源:

bool operator<(const Foo& a, const Foo& b) {
    //Actual comparison of members
}

bool operator>=(const Foo& a, const Foo& b) {
    return !(a < b);
}

bool operator>(const Foo& a, const Foo& b) {
    return b < a;
}

bool operator<=(const Foo& a, const Foo& b) {
    return !(b < a); //Can also do !(a > b)
}

问题来了,相等可以用小于来定义,但如果你需要严格的弱排序,它意味着不同于显式相等的东西:

bool operator==(const Foo& a, const Foo& b) {
    return !(a < b) && !(b < a);
}

bool operator!=(const Foo& a, const Foo& b) {
    return !(a == b);
}

bool operator==(const Foo& a, const Foo& b) {
    //Actual comparison of members.
}

bool operator!=(const Foo& a, const Foo& b) {
    return !(a == b);
}