Здравствуйте, LaptevVV, Вы писали:
LVV>Вот смотри, интерфейс класса LVV>
class Fraction final{
LVV> [/b]
LVV> // преобразование в int - целая часть дроби
LVV> operator int() const noexcept;
LVV> // дружественные функции
LVV>};
LVV>
Естественно, в коде реализация отсутствует. LVV>Нет никаких определений операций сравнения. LVV>Но!Вот такой код работает абсолютно правильно: LVV>
LVV> Fraction A {3}; // целое = <3/1>
LVV> Fraction B {6,4}; // дробь = <3/2>
LVV> cout << A << B << endl;
LVV>// это работает - почему ?
LVV> cout << std::boolalpha
LVV> << (A == B) << '\n'// false
LVV> << (A != B) << '\n'// true
LVV> << (A < B) << '\n'// false
LVV> << (A <= B) << '\n'// false
LVV> << (A > B) << '\n'// true
LVV> << (A >= B) << '\n'; // true
LVV> LVV>Трехстроннее сравнение автоматом синтезируется ? LVV>Или обычные сравнения автоматом синтезируется ?
А ты неявный оператор приведения к инту не пробовал объявить явным, или вообще убрать?
--
Справедливость выше закона. А человечность выше справедливости.
LVV>>А если трехстороннее сравнение не определено в классе, чего тогда делается ? LVV>>Понятно, что равенство и неравенство можно сгенерить (но и тут есть нюансы). LVV>>А операция МЕНЬШЕ — генерится ? LVV>>И какой из трех вариантов порядка соблюдается ? B>А если попробовать?
А то я не пробовал
Вот смотри, интерфейс класса
Естественно, в коде реализация отсутствует.
Нет никаких определений операций сравнения.
Но!Вот такой код работает абсолютно правильно:
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
R>А ты неявный оператор приведения к инту не пробовал объявить явным, или вообще убрать?
Да, блин!
Неявные преобразования — зло абсолютное!
Спасибо.
Свежий взгляд мгновенно видит...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, K13, Вы писали:
LVV>>В результате код со сравнениями выдает именно то, что и ожидалось
K13>а если сравнить 2/5 и 1/2, какая будет меньше?
Так прямо в примере же есть ответ на этот вопрос:
Fraction A {3}; // целое = <3/1>
Fraction B {6,4}; // дробь = <3/2>
// . . .
<< (A < B) << '\n'// true
--
Справедливость выше закона. А человечность выше справедливости.
Вот завели в С++20 операцию трехстороннего сравнения.
Компилятор при ее реализации в классе генерит на ее основе правильные логические выражения с обычными операция сравнения.
А если трехстороннее сравнение не определено в классе, чего тогда делается ?
Понятно, что равенство и неравенство можно сгенерить (но и тут есть нюансы).
А операция МЕНЬШЕ — генерится ?
И какой из трех вариантов порядка соблюдается ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Вот завели в С++20 операцию трехстороннего сравнения. LVV>Компилятор при ее реализации в классе генерит на ее основе правильные логические выражения с обычными операция сравнения.
LVV>А если трехстороннее сравнение не определено в классе, чего тогда делается ? LVV>Понятно, что равенство и неравенство можно сгенерить (но и тут есть нюансы). LVV>А операция МЕНЬШЕ — генерится ? LVV>И какой из трех вариантов порядка соблюдается ?
Ну, вот.
Наконец-то получилось именно то, что я с самого начала и ожидал.
1. Объявил операцию трехстороннего сравнения в классе по дефолту
auto operator<=>(const Fraction& r) const noexcept = default;
В результате код со сравнениями выдает именно то, что и ожидалось
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'// true
<< (A <= B) << '\n'// true
<< (A > B) << '\n'// false
<< (A >= B) << '\n'; // false
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
LVV>>В результате код со сравнениями выдает именно то, что и ожидалось
K13>а если сравнить 2/5 и 1/2, какая будет меньше?
Лексикографически 2/5 > 1/2, та как 2 > 1
Но я реализовал правильное сравнение. K13>или 2/4 и 1/2 -- будут ли равны?
Будут — у меня автоматом сокращение идет.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!