Define std::remove_cvref and std::remove_cvref_t for C++2a
Also define __remove_cvref_t for internal use before C++2a. * include/std/any (any_cast): Use __remove_cvref_t. * include/std/tuple (__make_tuple): Likewise. * include/std/type_traits (__remove_cvref_t): Define. (__result_of_memobj, __result_of_memfun): Use __remove_cvref_t. [__cplusplus > 201703L] (remove_cvref, remove_cvref_t): Define. * include/std/variant (__erased_hash): Use __remove_cvref_t. From-SVN: r259887
This commit is contained in:
parent
31aac34486
commit
6791489ee5
|
@ -1,3 +1,12 @@
|
|||
2018-05-03 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/std/any (any_cast): Use __remove_cvref_t.
|
||||
* include/std/tuple (__make_tuple): Likewise.
|
||||
* include/std/type_traits (__remove_cvref_t): Define.
|
||||
(__result_of_memobj, __result_of_memfun): Use __remove_cvref_t.
|
||||
[__cplusplus > 201703L] (remove_cvref, remove_cvref_t): Define.
|
||||
* include/std/variant (__erased_hash): Use __remove_cvref_t.
|
||||
|
||||
2018-05-02 François Dumont <fdumont@gcc.gnu.org>
|
||||
|
||||
* include/bits/deque.tcc (deque<>::_M_assign_aux): Cast to void to
|
||||
|
|
|
@ -451,7 +451,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<typename _ValueType>
|
||||
inline _ValueType any_cast(const any& __any)
|
||||
{
|
||||
using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
|
||||
using _Up = __remove_cvref_t<_ValueType>;
|
||||
static_assert(any::__is_valid_cast<_ValueType>(),
|
||||
"Template argument must be a reference or CopyConstructible type");
|
||||
static_assert(is_constructible_v<_ValueType, const _Up&>,
|
||||
|
@ -477,7 +477,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<typename _ValueType>
|
||||
inline _ValueType any_cast(any& __any)
|
||||
{
|
||||
using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
|
||||
using _Up = __remove_cvref_t<_ValueType>;
|
||||
static_assert(any::__is_valid_cast<_ValueType>(),
|
||||
"Template argument must be a reference or CopyConstructible type");
|
||||
static_assert(is_constructible_v<_ValueType, _Up&>,
|
||||
|
@ -491,7 +491,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<typename _ValueType>
|
||||
inline _ValueType any_cast(any&& __any)
|
||||
{
|
||||
using _Up = remove_cv_t<remove_reference_t<_ValueType>>;
|
||||
using _Up = __remove_cvref_t<_ValueType>;
|
||||
static_assert(any::__is_valid_cast<_ValueType>(),
|
||||
"Template argument must be a reference or CopyConstructible type");
|
||||
static_assert(is_constructible_v<_ValueType, _Up>,
|
||||
|
|
|
@ -1499,8 +1499,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
// Returns the std::tuple equivalent of a tuple-like type.
|
||||
template<typename _Tuple>
|
||||
struct __make_tuple
|
||||
: public __do_make_tuple<typename std::remove_cv
|
||||
<typename std::remove_reference<_Tuple>::type>::type>
|
||||
: public __do_make_tuple<__remove_cvref_t<_Tuple>>
|
||||
{ };
|
||||
|
||||
// Combines several std::tuple's into a single one.
|
||||
|
|
|
@ -2092,6 +2092,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
return __declval<_Tp>(0);
|
||||
}
|
||||
|
||||
// __remove_cvref_t (std::remove_cvref_t for C++11).
|
||||
template<typename _Tp>
|
||||
using __remove_cvref_t
|
||||
= typename remove_cv<typename remove_reference<_Tp>::type>::type;
|
||||
|
||||
/// result_of
|
||||
template<typename _Signature>
|
||||
class result_of;
|
||||
|
@ -2193,8 +2198,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<typename _Res, typename _Class, typename _Arg>
|
||||
struct __result_of_memobj<_Res _Class::*, _Arg>
|
||||
{
|
||||
typedef typename remove_cv<typename remove_reference<
|
||||
_Arg>::type>::type _Argval;
|
||||
typedef __remove_cvref_t<_Arg> _Argval;
|
||||
typedef _Res _Class::* _MemPtr;
|
||||
typedef typename conditional<__or_<is_same<_Argval, _Class>,
|
||||
is_base_of<_Class, _Argval>>::value,
|
||||
|
@ -2209,8 +2213,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
template<typename _Res, typename _Class, typename _Arg, typename... _Args>
|
||||
struct __result_of_memfun<_Res _Class::*, _Arg, _Args...>
|
||||
{
|
||||
typedef typename remove_cv<typename remove_reference<
|
||||
_Arg>::type>::type _Argval;
|
||||
typedef __remove_cvref_t<_Arg> _Argval;
|
||||
typedef _Res _Class::* _MemPtr;
|
||||
typedef typename conditional<__or_<is_same<_Argval, _Class>,
|
||||
is_base_of<_Class, _Argval>>::value,
|
||||
|
@ -2399,8 +2402,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
// Internal type trait that allows us to sfinae-protect tuple_cat.
|
||||
template<typename _Tp>
|
||||
struct __is_tuple_like
|
||||
: public __is_tuple_like_impl<typename remove_cv<
|
||||
typename remove_reference<_Tp>::type>::type>::type
|
||||
: public __is_tuple_like_impl<__remove_cvref_t<_Tp>>::type
|
||||
{ };
|
||||
|
||||
template<typename _Tp>
|
||||
|
@ -2942,6 +2944,17 @@ template <typename _From, typename _To>
|
|||
big = __ORDER_BIG_ENDIAN__,
|
||||
native = __BYTE_ORDER__
|
||||
};
|
||||
|
||||
/// Remove references and cv-qualifiers.
|
||||
template<typename _Tp>
|
||||
struct remove_cvref
|
||||
{
|
||||
using type = __remove_cvref_t<_Tp>;
|
||||
};
|
||||
|
||||
template<typename _Tp>
|
||||
using remove_cvref_t = __remove_cvref_t<_Tp>;
|
||||
|
||||
#endif // C++2a
|
||||
|
||||
_GLIBCXX_END_NAMESPACE_VERSION
|
||||
|
|
|
@ -289,7 +289,7 @@ namespace __variant
|
|||
size_t
|
||||
__erased_hash(void* __t)
|
||||
{
|
||||
return std::hash<remove_cv_t<remove_reference_t<_Tp>>>{}(
|
||||
return std::hash<__remove_cvref_t<_Tp>>{}(
|
||||
__variant::__ref_cast<_Tp>(__t));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue