шаблон передается по значению или константной ссылке или…?

Я могу написать шаблонную функцию таким способом

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

или таким способом

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

Я предполагаю, что второй вариант может быть более оптимален, поскольку он явно избегает копирования, но я подозреваю, что он также может давать сбой для некоторых конкретных типов T (например, функторов?). Итак, когда следует использовать первый вариант, а когда использовать второй? Есть также эти boost :: call_traits :: param_type и boost :: reference_wrapper , которые были в ответах на мой предыдущий вопрос , но люди не не везде их используют, не так ли? Есть ли для этого практическое правило? Спасибо.

7
задан Community 23 May 2017 в 11:59
поделиться