Некоторые операторы возвращают по значению, некоторые по ссылке. В общем случае оператор, результатом которого является новое значение (например, +, - и т. Д.), Должен возвращать новое значение по значению, а также оператор, результатом которого является существующее значение, но измененное (например, <<, >>, + =, - = и т. д.), должны возвращать ссылку на измененное значение.
Например, cout
- это std::ostream
, а вставка данных в поток является операцией изменения, поэтому для реализации оператора <<
для вставки в ostream
оператор определяется следующим образом:
std::ostream& operator<< (std::ostream& lhs, const MyType& rhs)
{
// Do whatever to put the contents of the rhs object into the lhs stream
return lhs;
}
Таким образом, когда у вас есть составной оператор, такой как cout << x << y
, сначала вычисляется подвыражение cout << x
, а затем выражение [result of cout << x ] << y
. Поскольку оператор <<
on x
возвращает ссылку на cout
, выражение [result of cout << x ] << y
эквивалентно cout << y
, как и ожидалось.
И наоборот, для «строка + строка» результатом является новая строка (обе исходные строки не изменены), поэтому она должна возвращаться по значению (в противном случае вы бы возвращали ссылку на временный объект, что является неопределенным поведением).