std正向实施和参考折叠

时间:2017-03-22 09:24:28

标签: c++11

在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);

现在两个案例是:

  1. 在这种情况下,fparam是rvalue,在f函数中,T被推导为 非引用对象类型,因此前向调用采用param 左值参考并将其投射到T&amp;&amp; (因为T不是参考)。

  2. fparam是左值,然后在f内,T被推断为T&amp;然后前进     将(作为参数)引用左值引用(折叠到左值)     参考)然后静态演员将是T&amp; &安培;&安培;这又是左值     参考

  3. 那么为什么我们需要从前进的参数中删除参考?是否与禁用演绎类型有关?有人可能会给出详细的解释。

    引用为重复的问题不是,答案基本上说std库使用删除引用但是为什么?

1 个答案:

答案 0 :(得分:3)

  

是否与禁用演绎类型有关?

是的,typename std::remove_reference<T>::type引入了non-deduced context。它可以防止用户误写...

std::forward(something)

...并强迫他/她提供明确的模板参数:

std::forward<T>(something)