При возврате ссылки можно избежать копирования, как уже отмечали другие. Однако я чувствую себя обязанным отметить, что в этой истории обычно есть что-то большее.
Прежде всего, возврат ссылки на локальный объект обычно приводит к проблемам. Поэтому, когда вы возвращаете ссылку, вам, как правило, нужно выполнить одно из двух:
- Вы возвращаете ссылку на некоторый ранее существующий объект (например, многие операторы iostreams передают ссылку на iostream и возвращают ссылку на тот же iostream; аналогично, оператор присваивания обычно
return *this;
).
- Функция динамически распределяет объект, который она возвращает. В этом случае, однако, гораздо чаще возвращать указатель, чем ссылку.
Я бы даже сказал, что в большинстве случаев недостаток копирования (или, по крайней мере, эффективность, полученная благодаря отсутствию копирования) является более или менее важной причиной, чем основная причина. Вы возвращаете ссылку. В случае iostream вы возвращаете ссылку в первую очередь потому, что iostream - это в основном объект типа «идентичность» - то есть вы не можете скопировать или назначить его. Вы создаете один, используете ссылки на этот единственный объект, и когда вы закончите, вы уничтожаете его.
Когда вы передаете ссылку на объект, основной целью часто является удаление копии. Однако, когда вы возвращаете ссылку, это происходит гораздо реже.
Я бы также отметил, что в течение некоторого времени в большинстве компиляторов реализована оптимизация возвращаемых значений и оптимизация именованных возвращаемых значений (RVO / NRVO). Это означает, что возврат значения часто не теряет никакой эффективности по сравнению с возвратом ссылки в любом случае (на самом деле, произойдет, если компилятор внутренне превратит ваш код, который возвращает значение, в код, который получает ссылка и записывает непосредственно в значение родителя).
Итог: возвращение ссылки не так просто и очевидно, как может показаться на первый взгляд. За исключением нескольких ситуаций, в которых рутина (операторы вставки, извлечения и присваивания являются наиболее очевидными) вам, вероятно, действительно нужно подумать и понять, что вы делаете, а не просто очевидной оптимизации.