Почему я не могу определить operator = с не ссылочным типом возврата? - PullRequest
1 голос
/ 23 мая 2011

Оператор = в C ++ внутри класса объявляется так:

 MyType & operator=(const MyType & rhs);

Рассуждается так, будто это необходимо для создания цепочки. Но так как оператор = имеет правильный приоритет, то возврата значения должно быть достаточно.

Ответы [ 5 ]

4 голосов
/ 23 мая 2011

Вы, безусловно, можете объявить operator = с не ссылочным типом возврата. Фактически, в очень редких случаях, когда я его реализую, я обычно заставляю его возвращать void, так как я не думаю, что множественные назначения или проверка результата назначения являются одной из величайших возможностей C ++.

0 голосов
/ 23 мая 2011

Я считаю, что лучше всего, чтобы компилятор автоматически генерировал operator = (). В тех случаях, когда вам действительно нужно это указать (для глубокой копии, скорее всего), я бы не стал делать ничего нестандартного. Это может смутить других разработчиков.

Не будь слишком умным:)

0 голосов
/ 23 мая 2011

Вы можете вернуть по значению, ничто не остановит вас. "Цепные" люди, на которые ссылаются, - это операторы типа (a = b) = c, которые присваивают b a, а затем присваивают c a. Это практически не имеет практического применения, поэтому, если вы решили вернуть по значению, это совершенно нормально.

Текущее состояние дел связано с тем, что для примитивов назначение определяется таким образом. Таким образом, оператор присваивания, предоставляемый компилятором, работает точно так же, и обычно вы хотите, чтобы перегруженные операторы по возможности вели себя как встроенные аналоги. В этом конкретном случае, тем не менее, учитывая относительную неясность этой конкретной конструкции, вы вряд ли кого-то запутаете, изменив это поведение. Пока вы не делаете что-то совершенно неожиданное, например, возвращаете логическое значение, чтобы указать, успешно ли выполнено присваивание, это не должно иметь значения.

0 голосов
/ 23 мая 2011

Да, но причина может или не может иметь ничего общего с приоритетом. Причина возврата ссылки, а не значения, та же, что и для передачи rhs (в вашем примере) в качестве постоянной ссылки вместо значения: лучшая производительность. Таким образом, вы можете вернуть только значение, если хотите, но учтите, что копия может быть создана.

Также вы должны принять во внимание, подготовлен ли ваш класс для копий.

0 голосов
/ 23 мая 2011

Если вы не вернетесь по ссылке, вы вернетесь по значению и не сможете присвоить значение, поскольку присваиваются только значения l. Даже если бы вы могли, это не имело бы значения, потому что объект, который вы назначили, был бы уничтожен вскоре после того, как вы его назначили, потому что это всего лишь копия объекта, а не сам объект.

По сути, вы пытаетесь сделать это:

int blah() { int blah = 5; return blah; }
blah() = 99;

Что, как вы видите, явно неверно.

Это зависит от того, в каком порядке вы выполняете назначения, потому что эта проблема возникнет только тогда, когда вы измените естественный порядок назначений, сделав один слева перед первым справа, как пример Оли в комментарии. на этот ответ:

(a = b) = c

Другая причина состоит в том, чтобы исключить ненужное копирование, хотя оптимизация компилятора может лишить этого преимущества.

Вы можете прочитать больше о lvalues ​​и rvalues ​​здесь: http://msdn.microsoft.com/en-us/library/bkbs2cds.aspx

...