Modified the definition of std::foward to address National Body Comment US 90

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@110805 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Howard Hinnant
2010-08-11 14:05:55 +00:00
parent 0a68a4d739
commit b271eff4c6

View File

@@ -1140,20 +1140,50 @@ move(_Tp&& __t)
return static_cast<typename remove_reference<_Tp>::type&&>(__t); return static_cast<typename remove_reference<_Tp>::type&&>(__t);
} }
template <class _Tp, class _Up, template <class _Tp,
class = typename _STD::enable_if< class = typename enable_if<
is_lvalue_reference<_Tp>::value ? is_lvalue_reference<_Up>::value : true !is_lvalue_reference<_Tp>::value
>::type, >::type
class = typename _STD::enable_if< >
is_convertible<typename remove_reference<_Up>::type*,
typename remove_reference<_Tp>::type*>::value>::type>
inline _LIBCPP_INLINE_VISIBILITY inline _LIBCPP_INLINE_VISIBILITY
_Tp&& _Tp&&
forward(_Up&& __t) forward(typename common_type<_Tp>::type& __t)
{ {
return static_cast<_Tp&&>(__t); return static_cast<_Tp&&>(__t);
} }
template <class _Tp,
class = typename enable_if<
!is_lvalue_reference<_Tp>::value
>::type
>
inline _LIBCPP_INLINE_VISIBILITY
_Tp&&
forward(typename common_type<_Tp>::type&& __t)
{
return static_cast<_Tp&&>(__t);
}
template <class _Tp,
class = typename enable_if<
is_lvalue_reference<_Tp>::value
>::type
>
inline _LIBCPP_INLINE_VISIBILITY
_Tp
forward(typename common_type<_Tp>::type __t)
{
return __t;
}
template <class _Tp,
class = typename enable_if<
is_lvalue_reference<_Tp>::value
>::type
>
_Tp
forward(typename remove_reference<_Tp>::type&& __t) = delete;
#else // _LIBCPP_MOVE #else // _LIBCPP_MOVE
template <class _Tp> template <class _Tp>