这个班级是否会有严格的弱序

Fla*_*ame 9 c++ math stl

说我有class/struct Foo

struct Foo {
    int a, b;
    bool operator< (Foo const& r){
        return a < r.a;
    }
    bool operator== (Foo const& r){
        return a==r.a&&b==r.b;
    }
};
Foo bar = { 5, 1 };
Foo baz = { 5, 2 };
Run Code Online (Sandbox Code Playgroud)

现在bar == baz是假的,但如此是bar < bazbaz < bar.

请注意,这里的排序完全忽略b但是b是平等关系的一部分.

Pet*_*ter 12

从技术上讲,是的,你是由a会员直接订购,这应该是好的,例如.std::set.基本上它们表现得像整数,即.如果a <b和b <c则a <c等,我不认为operator ==会影响运算符隐含的排序的有效性<.

但是 - 在同一个类上定义两个运算符是一个坏主意,这意味着它有不同的东西,因为它可能会使该类的用户感到困惑.据我所知,它不会直接破坏任何STL容器,因为它们只使用两个操作符中的一个,但它肯定会让我感到困惑,你可以将这个案例放在哪里!(bar <baz)和!(baz <bar)但是!(bar == baz).

在这种情况下,我更愿意仅作为成员提供对类更自然的运算符,并通过可作为模板参数提供给STL容器的独立结构使另一个可用.对我而言,它更清楚地表明它是一种排序类的实例的方式,它不一定等同于其他成员运算符.