在scott meyers的书中他提到了std forward的实现,就像这样(非标准符合)
template <typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
问题是为什么我们需要在这里删除引用?
所以典型的前向使用将在通用参考函数中如下:
template <typename T>
void f(T&& fparam)
{
g(forward<T>(fparam)); // assume there is g function.
}
没有删除引用,转发将如下所示
template <typename T>
T&& forward(T& param);
现在两个案例是:
在这种情况下,fparam是rvalue,在f函数中,T被推导为 非引用对象类型,因此前向调用采用param 左值参考并将其投射到T&amp;&amp; (因为T不是参考)。
fparam是左值,然后在f内,T被推断为T&amp;然后前进 将(作为参数)引用左值引用(折叠到左值) 参考)然后静态演员将是T&amp; &安培;&安培;这又是左值 参考
那么为什么我们需要从前进的参数中删除参考?是否与禁用演绎类型有关?有人可能会给出详细的解释。
引用为重复的问题不是,答案基本上说std库使用删除引用但是为什么?
答案 0 :(得分:3)
是否与禁用演绎类型有关?
是的,typename std::remove_reference<T>::type
引入了non-deduced context。它可以防止用户误写...
std::forward(something)
...并强迫他/她提供明确的模板参数:
std::forward<T>(something)