Может кто-нибудь объяснить, почему оператор присваивания шага (обычно) объявлено какПочему оператор присваивания шага должен возвращать ссылку на * этот
Foo& operator=(Foo&&);
Почему возвращать ссылку, а не например Foo
или Foo&&
? Я понимаю, почему мы хотим этого для обычного оператора присваивания, из-за правил ассоциативности, поскольку (a=b)=c
является логически сломанным (хотя все еще компилируемым), если он не возвращен ссылкой, но почему это так, когда RHS является rvalue (значение xvalue/prvalue)?
Не совсем понятно, что вы просите. Вы не можете вернуть «сам объект», кроме как по ссылке. Если вы имеете в виду «почему бы не вернуть копию объекта», то это работает только в том случае, если тип скопирован, и даже тогда копирование может стоить дороже, чем вам хотелось бы. '(a = b) = c' требует, чтобы первое выражение' (a = b) 'было _lvalue_ любым типом аргумента оператора присваивания, поэтому вам нужно вернуть ссылку, если вы хотите ее поддержать. –
@MikeSeymour Я изменил вопрос, почему бы не просто вернуть 'Foo'? или даже 'Foo &&'? Каковы правила «цепи», которые будут нарушены? – vsoftco
Возвращение 'Foo' является потенциально дорогостоящим и невозможным, если тип не копируется, как я уже сказал. Возвращение 'Foo &&' просто странно; вы не хотите, чтобы таинственно превращалось в _rvalues_, так что, например, 'f (a = b)' неожиданно переходит из 'a', если вы не сообщите об этом. –