Означает ли это предупреждение, что C ++ 20 запрещает использовать типичный оператор сравнения для сравнения двух объектов одного типа? Какова правильная альтернатива? Ожидается ли изменение ситуации в будущих черновиках?
Это на самом деле не типичный оператор сравнения, это уже своего рода неправильно - поскольку он допускает только объект const
на одной стороне (ваш тип A
также не удовлетворит новую концепцию equality_comparable
, даже без изменений в языке).
Вы должны написать это так:
struct A {
bool operator==(const A&) const;
// ^^^^^^
};
Это последнее правило для C ++ 20.
Проблема c заключается в том, что в C ++ 20 операторы сравнения добавляют новое понятие переписанных и перевернутых кандидатов. Так что поиск выражения a == b
также в конечном итоге приведет к сопоставлению операторов, подобных b == a
. В типичном случае это означает, что вам нужно писать меньше операторов, поскольку мы знаем, что равенство коммутативно.
Но если у вас есть несоответствие констант, то произойдет следующее: вы получите следующие два кандидата:
bool operator==(/* this*/ A&, A const&); // member function
bool operator==(A const&, /* this*/ A&); // reversed member function
С двумя аргументами типа A
. Первый кандидат лучше по первому аргументу, а второй кандидат лучше по второму аргументу. Ни один из кандидатов не лучше другого, а потому и неоднозначен.