| Template | Comments | |
| If T is a reference, function, or top-level const-qualified
 type, then type denotes T, otherwise
 T const. | ||
| If T is a reference, function, or top-level volatile-qualified
 type, then type denotes T, otherwise
 T volatile. | ||
| 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 | |
| [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,
 class F> struct conditional; | ||
| template<class... T> struct common_type; | ||
| Unless this trait is specialized (as specified in Note D, below),
 there shall be no member type. | ||
| 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 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. | ||