Если вы используете C ++ 11 или выше (что вам следует), возвращение std::list<Product>
является лучшим вариантом, поскольку копирование не будет.
Если вы используете более старый C ++, вы должен, вероятно, передать выходной параметр std::list<Product>&
. Использование списка указателей не является ни эффективным, ни удобным, и оно также вызовет копию на указателях - это может быть лучше, чем копирование всего продукта, но это все еще ненужная копия.
Кстати, если вас беспокоит эффективность, вам, вероятно, следует использовать вектор (если вы не уверены, что вам это не нужно).
О RVO (C ++ 11 или выше) - если вы возвращаете неконстантный объект из функция, она использует свой конструктор перемещения вместо копирования данных. Существует концепция исключения копирования - если вы возвращаете только что созданный
Например:
return std::vector{1,2,3,4,5};
Компилятор создаст объект на месте для возвращенного значения.
Примечание - исключение копии является частью стандартного выделенного текста как для C ++ 17.