STL использует первый подход (передача по значению)
Конечно, стандартные библиотеки передают итераторы и функторы по значению.Предполагается, что они (правильно или неправильно) дешевы для копирования, и это означает, что если вы напишите итератор или функтор, который будет дорого копировать, вам, возможно, придется найти способ оптимизировать его позже.
Но это только для целей, для которых стандартные библиотеки используют функторы - в основном это предикаты, хотя есть и такие вещи, как std::transform
.Если вы интегрируете функцию, которая предлагает какие-то математические библиотеки, в этом случае я полагаю, что вы, скорее всего, будете иметь дело с функциями, которые несут много состояний.Например, у вас может быть класс, представляющий полиномы n-го порядка с n + 1 коэффициентами в качестве нестатических элементов данных.
В этом случае может быть лучше использовать константную ссылку.При использовании такого функтора в стандартных алгоритмах, таких как transform
, вы можете обернуть его в небольшой класс, который выполняет косвенное обращение через указатель, чтобы гарантировать, что он остается дешевым для копирования.
Взятие неконстантной ссылки - этопотенциально раздражает пользователей, так как останавливает их переход во временные промежутки.