我不太了解这个std::move
功能
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
为什么remove_reference
?有人可以给我一个简单的解释吗?
我不太了解这个std::move
功能
template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
return a;
}
为什么remove_reference
?有人可以给我一个简单的解释吗?
想想如果T
是左值引用会发生什么,例如MyClass &
. 在这种情况下,T &&
将变为MyClass & &&
,并且由于引用折叠规则,这将MyClass &
再次转换为。为了获得正确的结果,typename remove_reference<MyClass&>::type&&
首先从类型中删除任何引用修饰,因此MyClass &
映射到MyClass
,然后将右值引用应用于它,产生MyClass &&
。
因为对左值引用的右值引用会衰减为左值引用,并且返回左值引用的语义与您所期望的语义不同move
。
编辑:嗯,为什么投反对票?看看这段代码:
template < typename T > T&& func(T&& x) { return x; }
int main()
{
int x;
int &y = func(x);
}
进一步阅读:http ://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html