#опытным
Перегрузка операторов - дело не для слабонервных. Этим пугают детей и пытают людей. Только прожженные плюсовики могут сходу сказать разницу в перегрузке префиксного и постфиксного декремента/инкремента.
Но не только в этом дело. Есть такие операторы, которые как бы можно перегружать, но непонятно, для чего это делать.
Вот например, оператор взятия адреса. Да его можно перегружать. Можно его перегружать как метод:
struct Class {
int* operator &() {
return &member;
}
int member;
};Можно, как свободную функцию:
struct A {
int member;
};
int* operator &(Class& obj) {
return &obj.member;
}Но странновато это все.
Есть объект. У него есть занимаемое место. Зачем вообще заменять такое интуитивно понятное поведение?
Решение сделать этот оператор кастомным очень спорное. В реальном коде вы такого скорее всего никогда не встретите. А если подумаете, что неплохо было бы в своем коде заюзать эту фичу, то подумайте еще раз 300.
Но все-таки если оно есть, значит кто-то этим пользуется.
Например, для врапперов. Вы написали обертку для класса и хотите прозрачно передать контроль над объектами класса в обертку. Тогда вам возможно может понадобиться возвращать из оператора & указатель на внутренний объект, а не на объект враппера.
Однако тогда встает вопрос, как нормально взять адрес у обертки, если это пригодиться?
Но и на этот вопрос есть ответ. Но обсудим мы его несколько позже.
Однако уже сейчас видно, что для пользователя кода создаются серьезные препятствия для его понимания и использования. Если нужно из обертки доставать адрес оборачиваемого объекта - сделайте геттер, как у умных указателей и не парьтесь с перегрузкой.
Follow the beaten path. Stay cool.
#cppcore