plantilla pasar por valor o referencia constante o ...?

Puedo escribir una función con plantilla de esta manera

template<class T> void f(T x) {...}

o de esta manera

template<class T> void f(T const& x) {...}

Supongo que la segunda opción puede ser más óptima ya que evita explícitamente una copia, pero sospecho que también puede fallar para algunos tipos específicosT (por ejemplo, ¿functors?) Entonces, ¿cuándo debería usar la primera opción y cuándo usar la segunda? También hay estoboost::call_traits<T>::param_type yboost::reference_wrapper que estaban en las respuestas a miPregunta anterior, pero la gente no los usa en todas partes, ¿verdad? ¿Hay una regla general para esto? Gracias.

Respuestas a la pregunta(5)

Su respuesta a la pregunta