How about:

struct s {
    int id;
    std::string name;

    auto operator<=>(const s& x) const { return for_compare() <=> x.for_compare(); }
private:
    auto for_compare() const { return std::forward_as_tuple(id); }
};

This can be used to omit certain fields, change the ordering, negate a field to reverse to comparison sense, etc.

On Mon, 2023-01-16 at 21:26 +0000, joeri _ via Std-Proposals wrote:

The introduction of a standard attribute [[nocompare]] which can be used to indicate that a suboject of T should be omitted from a defaulted comparison.

 

struct s {

    int id;

    [[nocompare]] std::string name;

 

    auto operator<=>(s const&) const = default;

};

 

Only member 'id' of class 's' will be compared when ordering or testing objects of 's' for equality. This prevents having to define all the relational operators when only wanting to opt-out a single data-member, and it mitigates the user of having to write dry and error-prone code.

 

With kind regards,

 

Joeri Kok