什么时候应该使用 boost call_traits::p aram_type 而不是通用引用?

When should I use boost call_traits::param_type versus a universal reference?

提问人:Joseph Garvin 提问时间:10/23/2012 更新时间:10/23/2012 访问量:1879

问:

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

C++ 性能 提升 C++11 参数传递

评论

3赞 Kerrek SB 10/23/2012
两者只是不同。例如,在第一个版本中,无法推导模板参数。
1赞 Kerrek SB 10/23/2012
正如我所说,它们是不同的东西。如果您知道所需的类型,请使用 boost 的东西。如果要允许任何类型,请使用通用引用。
7赞 Xeo 10/23/2012
我发现通用引用非常无用,tbh。调用特征是参数传递优化的努力,这在 C++11 中不再需要。只需采用通用参考并完美推进到您想要的任何内容中。实际上,所做的只是为您提供内置函数的值类型和其他所有内容的引用类型。call_traitscall_traits
2赞 GManNickG 10/23/2012
@Xeo:不仅仅是 N^2,而是 2^N!不,这不是阶乘。
1赞 Kerrek SB 10/23/2012
@JosephGarvin:我的观点是,在你的第一个例子中,是固定的(不要介意引用性)。使用通用模板,您根本不修复类型,而是允许用户传递任何内容,并希望这在以后有用。它本质上是将任何潜在的转换推迟到以后的阶段。T

答: 暂无答案