【问题标题】:std forward implementation and reference collapsingstd 前向实现和引用折叠
【发布时间】: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);

现在这两种情况是:

  1. fparam 是右值,在这种情况下,在 f 函数内部,T 被推断为 非引用对象类型,因此前向调用采用参数 左值引用并将其转换为 T&&(因为 T 是非引用)。

  2. fparam 是左值,然后在 f 内推导出 T 为 T& 然后向前 将(作为参数)对左值引用的引用(折叠为左值 参考)然后静态转换将是 T& && 这又是左值 参考。

那么为什么我们需要从 forward 的参数中删除引用呢?它可能与禁止推导类型有关吗?谁能给个详细的解释。

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

【问题讨论】:

标签: c++11


【解决方案1】:

这可能与禁止推导类型有关吗?

是的,typename std::remove_reference&lt;T&gt;::type 引入了 non-deduced context。防止用户误写...

std::forward(something)

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

std::forward<T>(something)

【讨论】:

  • 谢谢我猜到了,但我想确定一下,我想也许另一个具有明确名称的 std 函数会更清楚。但这是在 forward 函数中删除引用的唯一原因吗?
  • 迈耶斯也应该提到这一点:)
  • 为什么误以为?在不指定模板类型的情况下使用forward 会有什么问题/危险?为什么在使用 move 时这是错误/危险的?
  • @EnricoMariaDeAngelis:forward 是条件移动,条件取决于你传递的参数。没有参数是没用的。 move 是一个无条件的移动,所以它不需要任何额外的输入。
  • This anwer 坚持认为forward 如果不采用显式参数将毫无用处。反正我还没有完全掌握。
猜你喜欢
  • 2014-09-03
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多