移动语义std :: move

时间:2011-04-03 11:45:13

标签: c++ c++11 move-semantics

我不太了解std::move功能

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

为什么remove_reference? 有人可以给我一个简单的解释吗?

2 个答案:

答案 0 :(得分:17)

考虑如果T是左值引用会发生什么,例如MyClass &。在这种情况下,T &&将变为MyClass & &&,并且由于引用折叠规则,这将再次转换为MyClass &。为了获得正确的结果,typename remove_reference<MyClass&>::type&&首先从类型中删除任何引用装饰,因此MyClass &映射到MyClass,然后将rvalue引用应用于它,产生{{1} }。

答案 1 :(得分:7)

因为对左值引用的右值引用会衰减为左值引用,并且引用左值引用将具有与move所期望的语义不同的语义。

编辑: 嗯,为什么要downvote?看看这段代码:

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