宇宙飞船操作员的真实世界使用示例

Real world usage example for spaceship operator

宇宙飞船运算符的定义是为了对顺序进行严格定义,但这会影响您的 客户端代码 的编写方式还是如何定义您的 class 比较运算符?

因为在其他 post 中缺少真实世界的示例,所以我没有完全理解这部分。

关于宇宙飞船操作员的其他post:

<=> 让懒惰的方式也成为高效的方式。您不要更改 您的客户端代码。

当存在 using std::rel_ops(或 boost::ordered 等)时,客户端可能会看到性能优势。

一个例子

// old and busted
struct Person : boost::totally_ordered<Person>
{
    std::string firstname;
    std::string lastname
    bool operator<(const Person & other) 
    { 
        return std::tie(firstname, lastname)
             < std::tie(other.firstname, other.lastname); 
    }
}

// new hotness
struct Person
{
    std::string firstname;
    std::string lastname;
    auto operator<=>(const Person &) = default;
}

int main()
{
    Person person1 { "John", "Smith" };
    Person person2 { "John", "Smith" };
    std::cout << person2 <= person1 << std::endl;
}

你只是比较一下你一直以来的做法:

a < b

只是在幕后,该表达式的候选函数之一也会找到 (a <=> b) < 0,如果该候选函数存在并且恰好是最可行的候选函数,则会调用它。

您通常不会在 "client code" 中直接使用 <=>,您只需直接使用您想要的比较。

例如,给定:

struct X {
    int i;

    // this can be = default, just writing it out for clarity
    strong_ordering operator<=>(X const& rhs) const { return i <=> rhs.i; }
};

表达式

X{42} < X{57};

将评估为 X{42} <=> X{57} < 0(没有 < 候选,因此 <=> 非反向是最好的候选)。 X{42} <=> X{57} 的计算结果为 42 <=> 57,即 strong_ordering::less。还有那个 < 0 returns true。因此,初始表达式是 true... 正如预期的那样。

同样的运算符也直接给了我们那个X{57} > X{42},那个X{3} >= X{2},等等


<=>的优点是只需要写一个运算符而不是四个,该运算符通常比<更容易写,可以正确表达部分和部分的区别订单总数,并将其堆叠通常性能更高(例如,在 string 的情况下)。

此外,我们不必生活在每个人都假装 operator< 是唯一存在的关系运算符的怪异世界中。