2015-03-27 1 views
1

Может кто-нибудь объяснить, почему оператор присваивания шага (обычно) объявлено какПочему оператор присваивания шага должен возвращать ссылку на * этот

Foo& operator=(Foo&&); 

Почему возвращать ссылку, а не например Foo или Foo&&? Я понимаю, почему мы хотим этого для обычного оператора присваивания, из-за правил ассоциативности, поскольку (a=b)=c является логически сломанным (хотя все еще компилируемым), если он не возвращен ссылкой, но почему это так, когда RHS является rvalue (значение xvalue/prvalue)?

+1

Не совсем понятно, что вы просите. Вы не можете вернуть «сам объект», кроме как по ссылке. Если вы имеете в виду «почему бы не вернуть копию объекта», то это работает только в том случае, если тип скопирован, и даже тогда копирование может стоить дороже, чем вам хотелось бы. '(a = b) = c' требует, чтобы первое выражение' (a = b) 'было _lvalue_ любым типом аргумента оператора присваивания, поэтому вам нужно вернуть ссылку, если вы хотите ее поддержать. –

+0

@MikeSeymour Я изменил вопрос, почему бы не просто вернуть 'Foo'? или даже 'Foo &&'? Каковы правила «цепи», которые будут нарушены? – vsoftco

+0

Возвращение 'Foo' является потенциально дорогостоящим и невозможным, если тип не копируется, как я уже сказал. Возвращение 'Foo &&' просто странно; вы не хотите, чтобы таинственно превращалось в _rvalues_, так что, например, 'f (a = b)' неожиданно переходит из 'a', если вы не сообщите об этом. –

ответ

4

Возврат Foo является потенциально дорогостоящим и невозможным, если тип не копируется. Это также удивительно: (a=b)=c создаст временное назначение и назначит c тому, когда вы ожидали, что оба назначения будут равны a.

Возврат Foo&& просто странный; вы не хотите, чтобы вещи таинственным образом превращались в rvalues ​​ так, чтобы, например, f(a=b) неожиданно перемещается с a, пока не сообщите об этом.

Возврат Foo& - это обычный способ заставить оператора вести себя неудивительно, если вы его цепью.

Смежные вопросы