... но как заставить компилятор сделать это?
Когда вы используете auto
в качестве возвращаемого типа по умолчанию operator<=>
, компилятор выберет общее категория сравнения всех членов. Поэтому, если у вас есть что-то вроде:
// any type that is weakly ordered
struct Weak {
bool operator==(Weak const&) const;
std::weak_ordering operator<=>(Weak const&) const;
};
struct Foo {
Weak w;
int i;
auto operator<=>(Foo const&) const = default;
};
, тогда использование <=>
на двух экземплярах типа Foo
даст вам weak_ordering
, поскольку это общая категория сравнения Weak
и int
.
Точно так же, как дано:
struct Bar {
float f;
auto operator<=>(Bar const&) const = default;
};
Bar::operator<=>
дает вам std::partial_ordering
.
Нет основных типов языков, которые бы давали вам std::weak_ordering
, но - это некоторые типы библиотек, которые могут:
// some typical C++17 comparable type
struct Widget {
bool operator==(Widget const&) const;
bool operator<(Widget const&) const;
};
struct LotsOfWidgets {
std::vector<Widget> widgets;
auto operator<=>(LotsOfWidgets const&) const = default;
};
* * * * * * * * * <=>
здесь возвращает std::weak_ordering
(чтобы не предполагать, что вы имели в виду под <
и ==
).
Или вы могли бы просто предоставить это себе. У вас нет для использования auto
:
struct WeakInt {
int i;
friend std::weak_ordering operator<=>(WeakInt, WeakInt) = default;
};