右值引用、移動語義和完美轉發可以參考這篇文章 https://www.jianshu.com/p/d19fc8447eaa
一.move
/usr/include/c++/7/bits/move.h
template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{ return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
remove_reference的實現如下
/usr/include/c++/7/type_traits
/// remove_reference
template<typename _Tp>
struct remove_reference
{ typedef _Tp type; };
template<typename _Tp>
struct remove_reference<_Tp&>
{ typedef _Tp type; };
template<typename _Tp>
struct remove_reference<_Tp&&>
{ typedef _Tp type; };
二.forward
/usr/include/c++/7/bits/move.h
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }