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

Dea*_*ean 9 c++

我注意到std::forward在这方面没有用处:

void consumeObject(std::unique_ptr<Object>&& robj) {
  myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
Run Code Online (Sandbox Code Playgroud)

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

为什么它错了/没用?

Rei*_*ica 14

这不是std::forward在这里(本身),但它是不恰当的,从而误导(在这个意义上,可以说,这其实是错误的).

你拼写"将某些内容转换为对其类型的右值引用"的方式是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);
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

左值
Rvalue
Rvalue

[生活]

  • 我会说'std :: forward`在这里肯定是错的,就像不可读的代码是错误的一样,无论它是否有效. (3认同)
  • 我不是说它是"不必要的"*.这相当*误导*(对读者而言). (3认同)