Почему перегрузка оператора << должна возвращаться ссылкой?

Я хочу распечатать объект определенного пользователем типа, например cout << ob1; поэтому я хочу перегрузить оператор < < и я хочу вернуться по значению не по ссылке, но он дает мне ошибку: в двух файлах с именем: iosfwd и ios_base.h

ostream operator<<( ostream& out, cat& rhs){ out << rhs.a << ", " << rhs.b << endl; return out ;
}

1) Это потому, что он не может создать новый объект ostream, поэтому он должен возвращаться по ссылке?

но когда я возвращаюсь по ссылке следующим образом:

ostream& operator<<( ostream& out, cat& rhs){ out << rhs.a << ", " << rhs.b << endl; return out ;
}

он отлично работает. 2) любое объяснение?

3 ответа

В первом примере вы возвращаете копию объекта потока, которая не разрешена, так как тип-конструктор (и назначение-копирование) классов потоков all на С++ отключен, поскольку они сделаны private.

Поскольку вы не можете создать копию объекта потока, вам необходимо вернуть его по ссылке, которую вы делаете во втором примере, поэтому он работает нормально.

Вы можете вообще ничего не возвращать (т.е. вы можете сделать тип возврата void), но если вы это сделаете, вы не сможете цепеть как stream << a << b. Вы должны написать их отдельно как stream <<a< code="">, а затем <code>stream << b.

<p>Если вы хотите знать, почему копирование объектов потока отключено, см. мой ответ здесь:</p> <ul> <li> <a href="https://stackoverflow.com/questions/6010864/why-copying-stringstream-is-not-allowed" target="_blank">Почему копирование stringstream не разрешено?</a></li> </ul>


Потоки не копируются, потому что копирование потока на самом деле не имеет смысла, поток уникален (вы не можете прыгать в одну и ту же реку в два раза). return by value находится в С++ 03, по крайней мере, копируя транзакцию.

Если есть причина, по которой вы хотите вернуться по значению, верните по ссылке правильную версию.


Это делается для поддержки безопасной и разумной цепочки операторов, например

cout<
<p>работает из-за возврата ссылки.</p>

licensed under cc by-sa 3.0 with attribution.