Согласно cppreference.com, std::rel_ops::operator!=,>,<=,>= будет устаревшим в C++ 20.
В чем причина?
Отвечает ли это на ваш вопрос? Почему в C++ 20 удален оператор! = Для многих типов стандартных библиотек?





В C++ 20 вы получаете трехстороннее сравнение (оператор <=>), который автоматически "генерирует" сравнения по умолчанию, если он предоставлен:
struct A {
// You only need to implement a single operator.
std::strong_ordering operator<=>(const A&) const;
};
// Compiler generates 4 relational operators (you need to default the
// three-way comparison operator to get == and !=).
A to1, to2;
if (to1 > to2) { /* ... */ } // ok
if (to1 <= to2) { /* ... */ } // ok, single call to <=>
У трехстороннего сравнения по сравнению с std::rel_ops есть несколько преимуществ, вероятно, поэтому операторы std::rel_ops устарели. В голове:
Он более универсален, поскольку в зависимости от типа возвращаемого значения operator<=> (std::strong_ordering, std::weak_ordering, ...) генерируются только соответствующие операторы. См. Заголовок <compare> для получения дополнительной информации.
Вы не создаете кучу шаблонных перегрузок операторов, выполняя using namespace std::rel_ops.
Вы можете попросить компилятор сгенерировать для вас трехсторонний оператор, установив его по умолчанию (auto operator<=>(A const&) = default) - это в основном сгенерирует лексикографическое сравнение базовых классов и нестатических элементов данных, а также выведет правильный тип упорядочения, если возврат тип - auto.
Ничего не могу с собой поделать, но «оператор космического корабля» звучит намного круче, чем «трехстороннее сравнение»: P
Насколько я понимаю, в большинстве случаев даже не потребуется внедрять <=>. Вместо этого можно будет писать std::strong_ordering operator<=>(const TotallyOrdered& that) const = default;
@ sv90 Да, вы правы, я добавил в список плюсов маркер;)
@ previouslyknownas_463035818: Думаю, слишком много [потенциальных] операторов оказались похожими на космические корабли ;-)
В документе с умным названием «<=>! = ==» [1] нельзя получить «operator ==» от «operator <=>», если только оператор <=> не установлен по умолчанию. [1] Что можно перевести на Python как «__cmp__ is not __eq__»
@MarcinZdun Спасибо за точность, но я не знаю, что вы пытались сделать со ссылкой, но документ, который вы процитировали, недоступен.
Ну, я не делал никаких ссылок на конкретный документ. «[1]» было ссылкой на ироничный «перевод» Python о том, как читать заголовок в той же заметке. Я просто не знал, что в комментариях нет символов новой строки, что слегка испортило шутку. Если вам интересно, фактический документ - P1185R1
@ L.F. Я потерялся. Я думал, что это именно то, что я сказал. Вы хотели перефразировать мой комментарий?
@MarcinZdun Извините, я пропустил часть, "если оператор <=> не установлен по умолчанию". Возможно, меня повредил вирус ...
C++ 20 предоставляет Трехстороннее сравнение, поэтому уникальные станут устаревшими.
What's the rationale behind?
rel_ops устарел Библиотечная поддержка оператора космического корабля (сравнения). В документе нет мотивации, но она есть в бумага для космического корабля:
This subsumes namespace
std::rel_ops, so we propose also removing (or deprecating)std::rel_ops.
В документе упоминаются четыре причины (включая правильность и производительность). Но одна большая проблема, о которой не упоминалось ни в одной из статей, заключается в том, что std::rel_ops просто ... не работает. Практическое правило состоит в том, что операторы находятся с использованием ADL. rel_ops не предоставляет вам операторов, которые можно найти в ADL, он просто объявляет неограниченные шаблоны функций, например:
namespace std {
namespace rel_ops {
template< class T >
bool operator!=( const T& lhs, const T& rhs )
{
return !(lhs == rhs);
}
}
}
Итак, используя такие алгоритмы, как:
struct X { ... };
bool operator<(X const&, X const&) { ... };
std::sort(values.begin(), values.end(), std::greater<>{});
Просто не работает, если вы не убедитесь:
#include <utility>
using namespace std::rel_ops;
Достаточно последовательно везде, как ваше первое включение, чтобы гарантировать, что эти операторы видны в точке определения каждого шаблона функции, который вы, возможно, могли бы вызвать.
Итак, operator<=> просто превосходит:
<=>) вместо двух (== и <)= default)
Вероятно, потому, что для C++ 20 принято трехстороннее сравнение.