Согласно Бьярну Страуструпу, ссылки были введены в C ++ для поддержки перегрузки операторов:
Ссылки были введены в основном для поддержки перегрузки операторов.
C передает каждый аргумент функции по значению, и если передача объекта по значению была бы неэффективной или неприемлемой, пользователь может передать указатель. Эта стратегия не работает там, где используется перегрузка операторов. В этом случае важно удобство записи, поскольку нельзя ожидать, что пользователи будут вставлять операторы адресации, если объекты большие. Например:
a = b - c;
является приемлемым (то есть стандартным) обозначением, но
a = & b - & c;
не является . В любом случае,
& b - & c
уже имеет значение в C, и я не хотел его менять.
Наличие в языке указателей и ссылок - постоянный источник путаницы для новичков в C ++.
Не мог ли Бьярн решить эту проблему, введя специальное языковое правило, которое позволяло аргументам объекта превращаться в указатели, если существует определяемая пользователем операторная функция, которая принимает такие указатели?
Объявление и использование вычитания тогда имело бы выглядело так:
Foo operator-(const Foo* x, const Foo* y);
a = b - c;
Было ли когда-либо предложено / рассмотрено такое решение? Будет ли это иметь серьезные недостатки?
Да, я знаю, ссылки дают другие преимущества из-за их ограничений, но дело не в этом.
Интересно, что оператор присваивания C с классами, похоже, работал именно так:
Изменение значения присваивания для объектов класса [...] выполняется путем объявления функции-члена класса, называемой
оператор =
. Например:class x { public: int a; class y * p; void operator = (class x *); {{ 1}}};