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

Why is std::forward useless in this context

本文关键字:这种情况下 毫无用处 forward std 为什么      更新时间:2023-10-16

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

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

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

为什么它错了/没用?

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

拼写"将某物强制转换为对其类型的右值引用"的方式是std::move。这是std::move所做的唯一的事情——它是一个static_cast<T&&>,在这里你不必拼写T

std::forward是另一种野兽,用于完美转发完美转发只出现在模板中,其中转发引用是可能的。转发引用是指由于语言中的特殊规则,可以推断为左值引用或右值引用的引用。在那里,您需要std::forward<T>来重新设置适当的值类别(左值或右值)。

玩具示例:

void print(int &)
{
  std::cout << "Lvaluen";
}
void print(int &&)
{
  std::cout << "Rvaluen";
}
template <class T>
void perfectForwarder(T &&v)
{
  print(std::forward<T>(v));
}
int main()
{
  int i;
  perfectForwarder(i);
  perfectForwarder(std::move(i));
  perfectForwarder(42);
}

输出为:

Lvalue
R值
R值

[直播]