我注意到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