c++ 为什么要使用std::remove_reference实现std::move?[副本]

vybvopom  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(109)

此问题已在此处有答案

How does std::move convert expressions to rvalues?(2个答案)
关闭7天前。
我不太明白std::move函数

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

为什么是remove_reference?有没有人给予简单解释一下?

wwtsj6pe

wwtsj6pe1#

想想如果T是一个左值引用会发生什么,例如MyClass &。在这种情况下,T &&将变成MyClass & &&,由于 * 引用折叠规则 *,这将再次转换为MyClass &。为了获得正确的结果,typename remove_reference<MyClass&>::type&&首先从类型中删除任何引用修饰,因此MyClass &被Map到MyClass,然后对它应用右值引用,产生MyClass &&

qv7cva1a

qv7cva1a2#

因为右值引用到左值引用会衰减为左值引用,并且返回左值引用的语义与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

相关问题