Насколько я понимаю, стандарт C++20 позволяет компилятору автоматически вызывать оператор обратного сравнения для == и <=>, когда оператор направления, используемый в коде, отсутствует, но существует обратный оператор. Как в этом примере:
struct A {
constexpr A() = default;
};
struct B
{
constexpr bool operator==(A const& other) const {
return true;
}
};
static_assert(B{} == A{}); // This is defined
static_assert(A{} == B{}); // Fails in C++17, automatically generated in C++20
Я просмотрел раздел стандарта [class.compare], но не нашел, где это указано.
Может кто-нибудь указать точное место в стандарте?
@HolyBlackCat Действительно, это видно по разборке! Спасибо, я отредактирую вопрос
@ vvv444 А поскольку для класса на самом деле ничего не создается, вам не нужно заглядывать в [класс]. Вместо этого вам нужно заглянуть в [over], так как это влияет только на разрешение перегрузки.
Что является обратным оператором <=>?
@ThomasMatthews На самом деле я не уверен. Могу ли я определить <=> между двумя разными типами? Вот так bool B::operator<=>(A const& other) const?
@ vvv444 в вашем заголовке упоминается обратная сторона <=>, поэтому мне любопытно. Я никогда не слышал об обратном операторе <=>, но я не использовал этот оператор.
@ThomasMatthews На самом деле, timsong-cpp.github.io/cppwp/n4868/over.match#oper-3.4.2 говорит о <=> реверсировании





https://timsong-cpp.github.io/cppwp/n4868/over.match#oper-3.4.4
Я думаю, что в:
Разрешение/операторы перегрузки в выражениях
[over.match.oper]
Для операторов равенства переписанные кандидаты также включают синтезированный кандидат с обратным порядком двух параметров, для каждого непереписанного кандидата на выражение y == x.
На самом деле они не генерируются, а вызываются при использовании обратной записи. Это, вероятно, описано рядом с «разрешением перегрузки».