/*
* 引用折叠
* A& & 折叠成 A&
* A& && 折叠成 A&
* A&& & 折叠成 A&
* A&& && 折叠成 A&&
*/
template<class _Ty>
struct remove_reference
{ // remove reference
using type = _Ty;
};
template<class _Ty>
struct remove_reference<_Ty&>
{ // remove reference
using type = _Ty;
};
template<class _Ty>
struct remove_reference<_Ty&&>
{ // remove rvalue reference
using type = _Ty;
};
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{
return static_cast<_Tp&&>(__t);
}
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type&& __t) noexcept
{
static_assert(!std::is_lvalue_reference<_Tp>::value, "template argument"
" substituting _Tp is an lvalue reference type");
return static_cast<_Tp&&>(__t);
}
template<typename _Tp>
constexpr typename remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept
{
return static_cast<typename remove_reference<_Tp>::type&&>(__t);
}
int cmInt = 2;
int commI = 1;
int& rInt = commI;
int&& rlVar = std::move(cmInt);
std::remove_reference(commI); // int
std::remove_reference(rInt); // int
std::remove_reference(rlVar); // int
std::forward<decltype(commI)>(commI); // int&&
std::forward<decltype(rInt)>(rInt); // int&
std::forward<decltype(rlVar)>(rlVar); // int&&
std::move(cmInt) // int&&
std::move(rInt) // int&&