почему оператор присваивания возвращает ref, а не указатель? - PullRequest
3 голосов
/ 23 августа 2011

Я видел некоторые вопросы и ответы по SO о Большой тройке и копировании и обмене. Действительно, я узнал кое-что новое, но есть одна вещь, которую я не совсем понимаю.

Почему оператор = возвращает ссылку, а не указатель?

Ответы [ 4 ]

7 голосов
/ 23 августа 2011

Ничто не мешает вам вернуть указатель, если вы хотите (хотя я не понимаю, почему), но если вы хотите имитировать поведение целочисленных типов в c ++, вы возвращаете ссылку.

3 голосов
/ 23 августа 2011

Оператор присваивания устанавливает операторы левой стороны равными его правой части, поэтому концептуально типы lhs и rhs должны совпадать.Если ваш оператор присваивания принимает в качестве параметра ссылку, он должен вернуть ссылку:

Foo &operator=(const Foo &f);

Было бы совершенно странно написать:

Foo *operator=(const Foo &f);   // this is weird because type of lhs != type of rhs

Теперь вы можете предоставитьверсия operator = (), которая присваивает один Foo * другому:

Foo *operator=(const Foo *f);

, но «большая тройка» или «правило трех» ничего не говорит о назначении указателей.«Правило» гласит, что если вы переопределите любой из {деструктор, оператор присваивания, конструктор копирования}, вам, вероятно, потребуется переопределить все из них, поскольку все они должны иметь дело с одним и тем же набором иваров.Но тогда вы назначаете один объект другому.Присвоение одного указателя другому обычно одинаково, независимо от типа указателя.

Подумайте, что произойдет, если вместо эталонной версии использовать версию оператора присваивания Foo *.: у вас не будет возможности установить два указателя так, чтобы они указывали на один и тот же объект.

3 голосов
/ 23 августа 2011

С какой стати, что хорошего будет указатель? Возвращая ссылку, вы можете сказать x = y = z;, что не указатель, и обычно позволяет использовать x = y в качестве lvalue того же типа, что и x.

Вы можете перегрузить любой оператор присваивания, который вам нравится, но стандартная практика возврата ссылки на сам объект очень полезна.

2 голосов
/ 23 августа 2011

Возвращение указателя будет означать, что вместо записи

a = b = c;

вы должны написать

*(a = b) = c;

, что некрасиво и также противоречит нормальному использованию C / C ++.

...