[C++标准库探索] 解析C++ move forward swap源码 原理探究

本文深入探讨C++标准库中的move、swap和forward。通过分析源码,解释了move如何无条件获取对象的右值引用,swap如何利用移动语义优化资源交换,以及forward如何实现完美转发。内容涵盖C++11及更高版本的特性,揭示了引用折叠原则在其中的作用。
摘要由CSDN通过智能技术生成

c++标准库选用gcc 4.8 以下标准库源码来源于bits/move.h

 

1.std::move

template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{ 
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); 
}

move是一个函数模板 模板参数为_Tp 功能是无条件获得指定对象的右值引用

由move的具体实现可以看出 move本质是一个强制类型转换 以static_cast完成

看到move的参数列表 该函数仅接收一个参数 注意到该参数类型是_Tp&& 这是一个万能引用

万能引用是一种既可以绑定到左值,又可以绑定到右值的类型,它几乎可以绑定到万事万物

那么move即意为无论接受的对象类型是什么样的 都会返回这个对象的右值引用 也就是"无条件"的体现

move是一个声明了noexcept的函数 这指明该函数不会抛出异常

看到一个重要的部分 返回值部分

返回值应用了std::remove_reference<_Tp>::type 这是标准库中提供的称为type_traits的工具

type_traits也可以译作类型萃取 用于在编译期进行某些类型转换 实现的核心技术是借助类模板和模板特化

std::remove_reference<_Tp>用于移除_Tp所带的引用类型 无论是左值引用还是右值引用

移除引用后 无论_Tp原来是什么 也许是单一的类型(如:int) 也许是带引用的类型(如:int& int&&) 现在都将是单一的类型(如int) 那么在这个单一的类型后跟上&& 那就表示了这个类型的右值引用(如:int&&) 这样是我们想得到的返回值类型 所以在此应用了引用移除技术 即std::remove_reference<_Tp>

std::remove_reference<_Tp>移除后的结果是通过type进行访问 type本质是一个typedef类型别名 

下面给出标准库中实现std::remove_reference<_Tp>的源码 可以看出有两个针对左右值引用的特化版本

  /// remove_reference
  template<typename _Tp>
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值