В целом (если нет проблем с производительностью), я бы вернулся по значению.
Прежде всего, существует семантическое различие: если ваши свойства изменяются, вы хотите, чтобы ваши клиенты обновляли это изменение или получали значение в момент вызова функции?
Существует очевидная проблема правильности: если вы вернетесь по ссылке, сущность, вызывающая функцию, может удержать ссылку и использовать ее после разрушения вашего объекта (что не так хорошо).
Другая проблема связана с многопоточным кодом, если один поток читает из ссылки на const, пока вы обновляете переменную, в которой возникает много проблем.
В любом случае, я думаю, что наиболее распространенный вариант использования - это когда вызывающая функция сохраняет значение в переменной.
string val = obj->get_str();
// use val now
Если это так (в отличие от cout << obj->get_str()
, где нет переменной), вам всегда нужно создать новую строку для val
, даже если вы вернетесь по ссылке и поскольку компиляторы могут выполнять RVO версия по значению не будет ниже варианта by-const-ref.
В заключение: если вы знаете, что это проблема производительности и вы уверены , что возвращаемое значение не будет храниться дольше, чем будет существовать ваш объект и вы не ожидаете, что будете использоваться из разных потоков, тогда все в порядке для возврата по константной ссылке.