【发布时间】:2017-08-14 07:32:14
【问题描述】:
在 scott meyers 的书中,他提到了一个 std forward 的实现,就像这样(不符合 std)
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 是右值,在这种情况下,在 f 函数内部,T 被推断为 非引用对象类型,因此前向调用采用参数 左值引用并将其转换为 T&&(因为 T 是非引用)。
fparam 是左值,然后在 f 内推导出 T 为 T& 然后向前 将(作为参数)对左值引用的引用(折叠为左值 参考)然后静态转换将是 T& && 这又是左值 参考。
那么为什么我们需要从 forward 的参数中删除引用呢?它可能与禁止推导类型有关吗?谁能给个详细的解释。
被引用为重复的问题不是,答案基本上是说std库使用remove reference但是为什么?
【问题讨论】:
标签: c++11