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>