В C++ 03 возвращение по значению, скорее всего, приводит к RVO (Оптимизация возвращаемого значения), которая будет исключать ненужную копию. В C++ 11 семантика перемещения позаботится о копии.
Итак, зачем возвращаться по значению в первую очередь? Потому что он предотвращает ненужные объекты с динамическим временем жизни. В вашем примере кода также не учитывается политика распределения, которую может использовать пользователь вашей функции.
В общем, возврат контейнера даже в C++ 11 по-прежнему представляет собой плохую идею: он ограничивает пользователей этим конкретным контейнером, так как невозможно перемещать контейнеры только для копирования. Стандартная библиотека решает эту проблему с OutputIteratorS
. Ваш алгоритм, скорее всего, будет записан как:
template<typename OutputIterator>
OutputIterator f(OutputIterator o);
Таким образом, вы абстрактными от контейнера, а также обойти исходную задачу.
Я не говорю, что это дубликат, но этот вопрос очень хорошо обсуждает различные аспекты этой проблемы: http://stackoverflow.com/questions/3350385/how-to-return-an-object-in-c – jogojapan