Я читал, что другие операторы больше не нужны (кроме ==).
Верно, , за исключением ==
- это бит ключа. Существует две категории операторов сравнения:
- операторы равенства (
==
, !=
) - операторы упорядочения (
<=>
, <
, >
, <=
, >=
)
В каждой из этих категорий первый из перечисленных мною (==
и <=>
) является оператором сравнения primary . Это единственный оператор, который вам нужно определить, если вы хотите включить эту категорию. Если вы хотите равенства, укажите ==
. Если вы хотите заказать, укажите <=>
(а также ==
). Другие операторы сравнения - это вторичные операторы сравнения - выражения, использующие вторичное сравнение, в C ++ 20 переписаны с использованием основного оператора сравнения.
Эти категории совершенно различны † - пересечения нет. Выражение x != y
может вызывать operator==(x, y)
или даже operator==(y, x)
, но оно никогда не вызовет operator<=>
любого вида.
У вас есть код, который требует сравнения на равенство, но не определен оператор равенства, следовательно, он некорректно сформирован. Чтобы это работало, вам нужно добавить:
bool operator==(const Iterator &a) const { return index == a.index; }
auto operator<=>(const Iterator &a) const { return index <=> a.index; }
Примечание ==
, а не !=
. Вы не должны объявлять вторичные операторы сравнения в C ++ 20, если только у вас нет особой c потребности в них (а это не такая необходимость).
Подробнее см. Сравнения в С ++ 20 .
† Единственное исключение из этого правила для удобства: если вы по умолчанию operator<=>
, тогда вы также получите объявленное, дефолтное operator==
, Это как если бы вы по умолчанию оба. В этом примере, поскольку ваши сравнения - это только сравнения по умолчанию для членов, вы могли бы написать:
auto operator<=>(const Iterator &a) const = default;
Как объявление с одним оператором сравнения, которое будет вести себя так, как если бы вы написали:
bool operator==(const Iterator &a) const = default;
auto operator<=>(const Iterator &a) const = default;
Что дает вам правильный оператор равенства, необходимый для вашей программы.