std::move 如何将表达式转换为右值?
std::move() 有助于将表达式转换为右值(右)值引用)以启用移动语义。然而,MSVC 标准库中的实现可能令人困惑。
实现如下:
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); }
让我们演示一下它是如何工作的:
Object obj1; Object obj2 = std::move(obj1); // _Ty&& _Arg binds to obj1
调用 std::move(),_Arg 引用参数绑定到左值 obj1。但是,由于不允许直接将右值引用绑定到左值,因此可能需要强制转换为右值引用,例如 (Object&&)。
进一步深入研究 std:: 的实现remove_reference 澄清了问题:
template<class _Ty> struct _Remove_reference { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&> { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&&> { // remove rvalue reference typedef _Ty _Type; };
此实现表明,remove_reference 将 T& 转换为 T,T&& 转换为 T,T&&& 转换为 T。因此,对于我们的情况,其中 obj1 是 Object 类型的左值,结果函数变为:
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
进一步详细说明:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
转换为 Object&& 是必要的,因为命名右值引用被视为左值,而不允许从左值到右值引用的隐式转换。
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
这里,C 11 的引用折叠规则发挥作用并允许表达式 Object& && 被解释为 Object&,一个左值引用,它确实可以绑定到左值。因此,最终函数将其参数转换为右值引用并返回它。
总之,std::move() 利用 std::remove_reference 来实现左值和右值都转换为右值,从而方便移动C 中的语义。
以上是`std::move()` 如何实现 C 中左值到右值的转换?的详细内容。更多信息请关注PHP中文网其他相关文章!