我读过几篇关于 && 的论文,我只是好奇是否有:
void fnc_1(int&& p)
{
//...
}
void fnc(int&& r)
{
fnc_1(r);//am I suppose to/should I? call it like so:fnc_1(std::forward(r))
}
或者只是通过'r'就足够了?
我读过几篇关于 && 的论文,我只是好奇是否有:
void fnc_1(int&& p)
{
//...
}
void fnc(int&& r)
{
fnc_1(r);//am I suppose to/should I? call it like so:fnc_1(std::forward(r))
}
或者只是通过'r'就足够了?
fnc_1(r)
不会编译,因为r
它是一个左值,就像任何其他变量一样,无论类型如何。是的,没错,命名的右值引用是左值,而不是右值。
fnc_1(std::forward(r))
也不会编译,因为std::forward
专门设计为不推断其模板参数。
要传递一个右值,以下任一方法都可以:
fnc_1(std::move(r))
fnc_1(std::forward<int&&>(r))
fnc_1(std::forward<int>(r))
Usingstd::move
是将左值转换为右值的惯用方式,因此我建议使用它。
std::forward
模板通常用于依赖类型。请仔细阅读这个问题,看看它是否适用于这里。这是一个难以掌握的主题,因此请随时使用有关您的确切问题的相关详细信息来更新您的问题(对整数使用右值引用并不是非常令人兴奋......)。
我相信您的问题是关于对右值引用的基本属性的理解。要记住的经验法则是:
&&
绑定到右值的类型。如果你有一个函数...
void foo(SomeClass&& x)
{
// ... then here x has type SomeClass& !
}
那么在主体内部,x
是一个名称,因此是一个l值。它真的有类型SomeClass&
。您必须使用std::move
将 aSomeClass&
变成SomeClass&&
:
void bar(SomeClass&& x)
{
// Since `x` has a name here, it is a Lvalue.
// Therefore it has type SomeClass&, what the signature doesn't indicate.
// We thus have to explicitly turn it into a rvalue:
foo(std::move(x));
}