我注意到std::forward
在这种情况下是无用的:
void consumeObject(std::unique_ptr<Object>&& robj) {
myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}
为什么?我认为当rvalue引用绑定到一个函数参数时(即我可以通过名称引用它),它在该范围内变为左值,并且为了被传递,需要被转换为右值引用(如在完美转发中) )。
为什么它错了/无用?
答案 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值
右值