std::move() 和表达式到右值的转换
std::move() 是 C 中一个强大的函数,允许您将对象从一个位置移动到另一个位置而不复制它们。理解其实现可能具有挑战性,但掌握其功能至关重要。
实现细节
MSVC 标准库中 std::move() 的实现使用std::remove_reference 模板将表达式转换为右值。它的工作原理如下:
template<class _Ty> inline typename tr1::_Remove_reference< _Ty >:: _Type& && move( _Ty && _Arg ) { return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg); }
绑定到左值
当您将左值传递给 std::move() 时,_Arg 引用参数会绑定到左值。但是,您不能直接将右值引用绑定到左值。为了解决这个问题,实现使用 std::static_cast 将左值转换为右值引用。
理解 std::remove_reference
std::remove_reference 用于删除来自类型的引用。这是它的实现:
template<class _Ty> struct _Remove_reference { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty && > { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty &&&&> { typedef _Ty _Type };
与右值一起使用
当使用右值调用 std::move() 时,std::remove_reference 将 T&& 转换为 T,导致以下函数模板实例化:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
需要强制转换,因为命名右值引用被视为左值。
与左值一起使用
当使用左值调用 std::move() 时,std::remove_reference 会将 T& 转换为 T ,产生以下函数模板实例化:
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
参考折叠规则C 11 标准提供的允许 Object& && 绑定到左值。结果函数有效地将左值参数转换为右值引用。
结论
std::move() 利用 std::remove_reference 和引用折叠规则来允许将左值和右值转换为右值引用。这可以实现高效的对象移动和内存使用的优化。
以上是`std::move()` 如何将 C 中的表达式转换为右值?的详细内容。更多信息请关注PHP中文网其他相关文章!