移动语义 std::move

move semantics std::move

本文关键字:move std 语义 移动      更新时间:2023-10-16

我不太了解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