Template  | Comments  | 
If T has type βreference to T1β then the
 member typedef type denotes T1;
 otherwise, type denotes T.  | |
If T is a referenceable type ([defns.referenceable]) then
 the member typedef type denotes T&;
 otherwise, type denotes T.   | |
Template  | Comments  | 
If T is a (possibly cv-qualified) signed integer
 type ([basic.fundamental]) then the member typedef
 type denotes T; otherwise,
 if T is a (possibly cv-qualified) unsigned integer
 type then type denotes the corresponding
 signed integer type, with the same cv-qualifiers as T;
 otherwise, type denotes the signed integer type with smallest
 rank ([conv.rank]) for which
 sizeof(T) == sizeof(type), with the same
 cv-qualifiers as T.   | |
If T is a (possibly cv-qualified) unsigned integer
 type ([basic.fundamental]) then the member typedef
 type denotes T; otherwise,
 if T is a (possibly cv-qualified) signed integer
 type then type denotes the corresponding
 unsigned integer type, with the same cv-qualifiers as T;
 otherwise, type denotes the unsigned integer type with smallest
 rank ([conv.rank]) for which
 sizeof(T) == sizeof(type), with the same
 cv-qualifiers as T.   | 
Template  | Comments  | 
If T is βmultidimensional array of Uβ, the resulting member
 typedef type denotes U, otherwise T.  | 
Template  | Comments  | 
If T has type β(possibly cv-qualified) pointer
 to T1β then the member typedef type
 denotes T1; otherwise, it denotes T.  | |
If T is a referenceable type ([defns.referenceable]) or a
 cv void type then
 the member typedef type denotes
 remove_reference_t<T>*;
 otherwise, type denotes T.  | 
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;  |