太空飞船操作员的实际用法示例

时间:2019-01-23 11:41:56

标签: c++ c++20 spaceship-operator

宇宙飞船运算符的定义本应具有强烈的订购定义,但这是否会影响您的客户代码的方式或仅影响如何定义类比较运算符?

由于在其他帖子中缺少现实世界中的示例,因此我对这部分内容不完全理解。

有关太空飞船运营商的其他SO帖子:

2 个答案:

答案 0 :(得分:4)

<=>允许懒惰方式也成为执行方式。您不要更改您的客户代码。

如果有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;
}

答案 1 :(得分:2)

您只需比较自己的工作方式即可:

a < b

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

通常,您不直接在“客户端代码”中使用<=>,而只是直接使用所需的比较。

例如,给定:

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的{​​{1}}。并且该strong_ordering::less返回< 0。因此,预期的初始表达式为true...。

同一运算符还直接给我们trueX{57} > X{42}等。


X{3} >= X{2}的优点是您只需要编写一个运算符而不是四个,该运算符通常比<=>更容易编写,您可以恰当地表达部分定单和全部定单之间的区别,然后将其堆叠通常会更有效(例如,在<之类的情况下)。

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