Главное правило перегрузки операторов — это здравый смысл. Перегружай оператор только если это действительно улучшает удобство и понятность для твоих пользователей. Этот принцип важнее всех остальных правил.
(x + y) - y должно равняться x)date1 - date2 имеет смысл (возвращает длительность), но date1 + date2 — нет+) должны:
+, ожидают копию, а не семантику +=)Определяй операторы с разными типами только если это концептуально имеет смысл:
date + duration ✓ (логично)duration - date ✗ (бессмысленно)++x и x++ должны иметь одинаковый видимый эффект на объект++x возвращает по ссылке; x++ возвращает копию по значению++x и x += 1 должны работать одинаковоx == y должен возвращать true если и только если объекты поведением эквивалентны== и != вместе, сохраняя: x == y равно !(x != y)<, <=, >, >=) вместе и сохраняй согласованность*p и p[0] должны быть эквивалентны и не изменять pp[i] и *(p+i) должны быть эквивалентны и не изменять p&&, ||) — перегруженные версии не выполняют короткое замыкание, что запутывает пользователей,) — теряет свои свойства упорядочения при перегрузке<< для push в стек)Оператор префикса ++x должен возвращать ссылку на модифицированный объект, а оператор постфикса x++ должен возвращать копию по значению, чтобы отразить их различную семантику.
Новый — ещё не проверен сообществом
Вы