Может ли перегрузка операторов работать без ссылок?

Согласно Бьярну Страуструпу, ссылки были введены в 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}}}; 
 
6
задан fredoverflow 4 November 2011 в 18:16
поделиться