STL utiliza el primer enfoque (paso por valor)
Claro, las bibliotecas estándar pase iteradores y funtores por valor. Se supone (con razón o sin ella) que es barato copiarlo, y esto significa que si escribe un iterador o un functor que es costoso copiar, es posible que tenga que encontrar la manera de optimizarlo más adelante.
Pero eso es solo para los propósitos para los que las bibliotecas estándar usan funtores: en su mayoría son predicados, aunque también hay cosas como std::transform
. Si está integrando una función, eso sugiere algún tipo de biblioteca matemática, en cuyo caso supongo que es mucho más probable que trabaje con funciones que conllevan un gran estado. Por ejemplo, podría tener una clase que represente polinomios de orden n, con n + 1 coeficientes como miembros de datos no estáticos.
En ese caso, una referencia constante podría ser mejor. Al usar dicho functor en algoritmos estándar como transform
, puede envolverlo en una pequeña clase que realice un direccionamiento indirecto a través de un puntero, para asegurarse de que sigue siendo barato copiarlo.
Tomar una referencia no constante es potencialmente molesto para los usuarios, ya que les impide pasar temporarios.
STL generalmente utiliza el primer enfoque porque surgen muchos problemas cuando utiliza contenedores de referencias, etc. –
Igual que en cualquier otro lugar: dependiendo de qué 'F' es, estas versiones pueden variar de ser idénticas a muy diferentes. Si 'F' es con estado, solo la versión intermedia podría ser posible. –
Básicamente, está imponiendo requisitos a los usuarios, cualquiera que sea la forma que elija. Si por valor, necesita que le proporcionen un functor que pueda copiarse sin perder integridad. Si es por referencia, entonces está requiriendo que le den algo con una duración de por vida apropiada para el usuario que lo esté colocando. – Mordachai