Первая причина: std::ostream
s не могут быть скопированы вообще (в C++ 11 конструктор копирования фактически delete
d). Вы не хотите, чтобы вернуть копию в любом случае, потому что сцепление не будет работать:
std::stringstream s;
s << "String1" << "String2";
бы не собрать, потому что, потому что копия возвращается при первом вызове оператора не будет превращаться в ссылки, необходимые для второго вызова ,
Создание обоих значений вместо ссылок также не будет работать:
std::stringstream s;
s << "String1" << "String2";
assert(s.str() == "String1String2");
Ваш код будет компилироваться, но утверждают, потерпит неудачу, потому что объект s
остается неизменным после этих звонков, потому что он был принят копией, а не по ссылке.
Вторая причина: все фактические stream
объектов, которые будут использоваться, из std::ostream
. Если этот параметр был передан копией, вы получите slicing, где вы фактически потеряете объект, который используете.
Это означает, что следующий код не будет работать (если передача по ссылке, но возвращение авторскими и каким-то образом обойти ошибки компиляции?):
std::stringstream s;
s << "String1" << "String2" << std::endl;
assert(s == "String1String2");
s
проведет только "String1"
в этом случае, потому что, когда вы вернулись std::stringstream
копией std::ostream
, возвращаемый объект больше не является объектом std::stringstream
и вызывает operator<<
, который передает "String2"
во временный объект, который только что уничтожается до конца.
Это две важные причины, по которым я могу думать, чтобы вернуться по ссылке, а не по значению.