为什么std :: forward在这种情况下无用

时间:2015-11-30 13:16:54

标签: c++

我注意到std::forward在这种情况下是无用的:

void consumeObject(std::unique_ptr<Object>&& robj) {
  myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}

为什么?我认为当rvalue引用绑定到一个函数参数时(即我可以通过名称引用它),它在该范围内变为左值,并且为了被传递,需要被转换为右值引用(如在完美转发中) )。

为什么它错了/无用?

1 个答案:

答案 0 :(得分:13)

错误在这里使用std::forward(本身),但这是不合适的,因此具有误导性(从这个意义上说,你可以说它 实际上是错误的。)

你拼写的方式&#34;将某些内容转换为对其类型的右值引用&#34;是std::move。这是std::move所做的唯一事情 - 它是static_cast<T&&>,您不必拼出T

std::forward是一种不同的野兽,旨在与完美转发一起使用。完美转发仅发生在模板中,其中转发参考是可能的。转发引用是一种引用,由于该语言中的特殊规则,它可以推导为左值引用或右值引用。在那里,您需要std::forward<T>来重新设置适当的值类别(左值或右值)。​​

玩具示例:

void print(int &)
{
  std::cout << "Lvalue\n";
}

void print(int &&)
{
  std::cout << "Rvalue\n";
}

template <class T>
void perfectForwarder(T &&v)
{
  print(std::forward<T>(v));
}

int main()
{
  int i;
  perfectForwarder(i);
  perfectForwarder(std::move(i));
  perfectForwarder(42);
}

输出将是:

  

左值
  R值
  右值

[Live]