// Composite type categories.
/// is_reference
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_reference)
+ template<typename _Tp>
+ struct is_reference
+ : public __bool_constant<__is_reference(_Tp)>
+ { };
+#else
template<typename _Tp>
struct is_reference
: public false_type
struct is_reference<_Tp&&>
: public true_type
{ };
+#endif
/// is_arithmetic
template<typename _Tp>
inline constexpr bool is_class_v = __is_class(_Tp);
template <typename _Tp>
inline constexpr bool is_function_v = is_function<_Tp>::value;
+
+#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_reference)
+template <typename _Tp>
+ inline constexpr bool is_reference_v = __is_reference(_Tp);
+#else
template <typename _Tp>
inline constexpr bool is_reference_v = false;
template <typename _Tp>
inline constexpr bool is_reference_v<_Tp&> = true;
template <typename _Tp>
inline constexpr bool is_reference_v<_Tp&&> = true;
+#endif
+
template <typename _Tp>
inline constexpr bool is_arithmetic_v = is_arithmetic<_Tp>::value;
template <typename _Tp>