Я могу написать шаблонную функцию таким способом
template<class T> void f(T x) {...}
или таким способом
template<class T> void f(T const& x) {...}
Я предполагаю, что второй вариант может быть более оптимален, поскольку он явно избегает копирования, но я подозреваю, что он также может давать сбой для некоторых конкретных типов T
(например, функторов?).
Итак, когда следует использовать первый вариант, а когда использовать второй? Есть также эти boost :: call_traits
и boost :: reference_wrapper
, которые были в ответах на мой предыдущий вопрос , но люди не не везде их используют, не так ли? Есть ли для этого практическое правило? Спасибо.