LVV>>А если трехстороннее сравнение не определено в классе, чего тогда делается ?
LVV>>Понятно, что равенство и неравенство можно сгенерить (но и тут есть нюансы).
LVV>>А операция МЕНЬШЕ — генерится ?
LVV>>И какой из трех вариантов порядка соблюдается ?
B>А если попробовать?
А то я не пробовал
Вот смотри, интерфейс класса
class Fraction final{
public:
struct divide_by_zero {}; // типы исключения
struct denumerator_is_zero {};
// конструкторы
Fraction() = default;
Fraction(int numerator) noexcept; // конструктор преобразования
Fraction(int num, int denum); // 2 аргумента
// методы
std::string toString() const;
// операции
Fraction& operator+=(const Fraction &R) noexcept;
Fraction& operator-=(const Fraction &R) noexcept;
Fraction& operator*=(const Fraction &R) noexcept;
Fraction& operator/=(const Fraction &R);
Fraction& operator++() noexcept;
Fraction& operator--() noexcept;
// трехстороннее сравнение
//int operator<=>(const Fraction&) const noexcept;
// преобразование в int - целая часть дроби
operator int() const noexcept;
// дружественные функции
friend std::istream& operator>>(std::istream& t, Fraction &r);
private:
int num {0}, denum{1}; // поля закрыты
void reduce(); // сокращение дроби
};
Естественно, в коде реализация отсутствует.
Нет никаких определений операций сравнения.
Но!Вот такой код работает абсолютно правильно:
Fraction A {3}; // целое = <3/1>
Fraction B {6,4}; // дробь = <3/2>
cout << A << B << endl;
// это работает - почему ?
cout << std::boolalpha
<< (A == B) << '\n' // false
<< (A != B) << '\n' // true
<< (A < B) << '\n' // false
<< (A <= B) << '\n' // false
<< (A > B) << '\n' // true
<< (A >= B) << '\n'; // true
Трехстроннее сравнение автоматом синтезируется ?
Или обычные сравнения автоматом синтезируется ?