passagem do modelo por valor ou referência const ou…?

Eu posso escrever uma função de modelo dessa maneira

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

ou dessa maneira

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

Acho que a segunda opção pode ser mais ideal, pois evita explicitamente uma cópia, mas suspeito que também pode falhar em alguns tipos específicosT (por exemplo, functors?). Então, quando usar a primeira opção e quando usar a segunda? Há também issoboost::call_traits<T>::param_type eboost::reference_wrapper que estavam nas respostas para o meupergunta anterior, mas as pessoas não as usam em todos os lugares, não é? Existe uma regra de ouro para isso? Obrigado.

questionAnswers(5)

yourAnswerToTheQuestion