| Template | Comments | 
| template<class T> struct type_identity; | |
| template<class T> struct remove_cvref; | |
| template<class T> struct decay; | [Note 1:  This behavior is similar to the lvalue-to-rvalue ([conv.lval]),
array-to-pointer ([conv.array]), and function-to-pointer ([conv.func])
conversions applied when an lvalue is used as an rvalue, but also
strips cv-qualifiers from class types in order to more closely model by-value
argument passing.β end note] | 
| template<bool B, class T = void> struct enable_if; | |
| template<class... T> struct common_type; | |
| Unless this trait is specialized,
 there shall be no member type. | |
| template<class... T> struct common_reference; | |
| If T is an enumeration type, the member typedef type denotes
 the underlying type of T ([dcl.enum]);
 otherwise, there is no member type. | |
| If the expression INVOKE(declval<Fn>(), declval<ArgTypes>()...) ([func.require])
 is well-formed when treated as an unevaluated operand ([expr.context]),
 the member typedef type denotes the type
 decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...));
 otherwise, there shall be no member type. Only the validity of the immediate context of the
 expression is considered. [Note 2:  The compilation of the expression can result in side effects such as
 the instantiation of class template specializations and function
 template specializations, the generation of implicitly-defined
 functions, and so on. Such side effects are not in the βimmediate
 contextβ and can result in the program being ill-formed.β end note] 
 Preconditions: Fn and all types in the template parameter pack ArgTypes
 are complete types, cv void, or arrays of
 unknown bound. | |
| If tuple-like<Tuple> is true
 and the expression
 INVOKE(declval<Fn>(), ELEMS-OF(Tuple)...) ([func.require])
 is well-formed
 when treated as an unevaluated operand ([expr.context]),
 the member typedef type denotes the type
 decltype(INVOKE(declval<Fn>(), ELEMS-OF(Tuple)...));
 otherwise, there shall be no member type. Only the validity of the immediate context of the expression is considered. [Note 3:  The compilation of the expression can result in side effects
 such as the instantiation of class template specializations
 and function template specializations,
 the generation of implicitly-defined functions, and so on. Such side effects are not in the βimmediate contextβ
 and can result in the program being ill-formed.β end note] | |
| template<class T> struct unwrap_reference; | If T is
 a specialization reference_wrapper<X> for some type X,
 the member typedef type of unwrap_reference<T>
 denotes X&,
 otherwise type denotes T. | 
| template<class T> unwrap_ref_decay; |