在C ++ 98中,我习惯在模板化函数中使用call_traits来自动选择传递参数的最佳方法,例如:
template<class T>
void foo(typename boost::call_traits<T>::param_type arg)
{
// .. do stuff with arg ..
}
优点是,对于原语,它将通过值传递,对于更复杂的对象,它将通过引用传递,因此我可以获得最少的开销。 C ++ 11现在有一个“通用引用”的概念:
template<class T>
void foo(T&& arg)
{
// .. do stuff with arg ..
}
据我所知,我需要使用通用引用才能使用std :: forward进行完美转发,所以如果我打算使用它,那么选择是明确的。但是,当我不打算,我应该更喜欢哪一个?通用参考是否会一直好或更好?