为什么只有模板才能返回右引用

C/C++ code

template<typename T>
T&& move(T &&t){
    return t;
}

int&& move_int(int &&a){
    return a;
}



前者可以,后者提示无法将右值引用绑定在左值.但是都知道非常量的右值引用能够绑定到非常量 lvalue 以及非常量上

作者: qfmyfeng   发布时间: 2011-06-15

还没研究0x

作者: downmooner   发布时间: 2011-06-15

我的vs2008第一个也不行。。。

作者: dizuo   发布时间: 2011-06-15

因为 a 在 move_int 里不是右值,所以无法绑定到右值引用,改成下面这样就行了。
C/C++ code

int&& move_int(int &&a){
    return std::move(a);
}

作者: ri_aje   发布时间: 2011-06-15

vs2005也不行

作者: luciferisnotsatan   发布时间: 2011-06-15

在 VS2010 的结果是第一个也不行,你实例化一下模板就知道了。

VS2010 标准库里面的 move 是这么写的:
C/C++ code
template<class _Ty> inline
    typename tr1::_Remove_reference<_Ty>::_Type&&
        move(_Ty&& _Arg)
    {    // forward _Arg as movable
    return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg);
    }


强制转换了一下才返回,不知道为什么……

我也记得右值引用可以绑定到左值来着……

作者: hpsmouse   发布时间: 2011-06-15