#c #c 20 #equality-operator
#c #c 20 #оператор равенства
Вопрос:
В C 20, если мы используем значение по умолчанию <=>
, то все остальные операторы сравнения также добавляются.
Здесь в коде класс имеет два целых числа, поэтому для сравнения потребуется пользовательское сравнение. Но поскольку оператор равенства будет сгенерирован автоматически, мне нужно знать, как он будет сравнивать объекты. Что произойдет, если существует составной тип.
#include<compare>
#include<iostream>
using namespace std;
class Point {
int x;
int y;
public:
Point(int x, int y):x(x),y(y){}
friend strong_ordering operator<=>(const Pointamp;, const Pointamp;) = default;
};
int main()
{
Point p(2,3), q(2,3);
if(p==q) cout << "same" << endl;
else cout << "different" << endl;
return 0;
}
Комментарии:
1. Что вы подразумеваете под «может быть сгенерирован»? Он сравнивает, если все члены равны, нет?
2. Итак, сравнивает ли он каждый элемент?
3.Операторы сравнения по умолчанию — en.cppreference.com/w/cpp/language/default_comparisons «…Оператор по умолчанию<=> выполняет лексикографическое сравнение путем последовательного сравнения базовых (сначала слева направо в глубину), а затем нестатических элементов (в порядке объявления) подобъектов T для вычисления <=> , рекурсивного расширения элементов массива (в порядке увеличения нижнего индекса) и ранней остановки, когданайден неравный результат, …»
Ответ №1:
Все операторы сравнения по умолчанию любого типа работают одинаково. Они сравнивают все подобъекты (базовые классы и члены) в порядке объявления, один за другим, пока не будут определены критерии сравнения.
Итак, для проверки равенства он проверяет Point::x
Point::y
. Но это остановится, x
если x
были неравными.
Комментарии:
1. Этот оператор равенства автоматической перегрузки сначала сравнивает размер объекта? Поскольку встроенный
==
в стандарт pre 20 требовал, чтобы общие размеры объекта проверялись перед итерацией по каждому элементу, это может показать много неравенств, не тратя время на перебор тысяч элементов. Что делает его неотъемлемо отличным от<=>
того, который должен просматривать элементы, чтобы получить> или < независимо от совпадения общего размера, и поэтому не имеет никаких оснований для проверки общих размеров.2. @MaxPower: » Этот оператор равенства автоматической перегрузки сначала сравнивает размер объекта? » Операторы сравнения могут использоваться по умолчанию, только если они сравнивают одни и те же типы. И один и тот же тип всегда имеет одинаковый «размер объекта». » Поскольку встроенный == в стандарт до 20 требовал, чтобы перед итерацией по каждому элементу проверялись общие размеры объекта » Нет «встроенного == в стандарт до 20». Стандартные библиотечные контейнеры имеют свои собственные
==
перегрузки. Большинство из них все еще работают, потому что поведение по умолчанию не имеет смысла для сложных структур данных.