在 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 获得完美的转发,所以如果我打算使用它,那么选择是明确的。但是当我不打算这样做时,我应该更喜欢哪个?通用参考总是一样好还是更好?