The member typedef type names the type T.
The member typedef type names the same type as remove_cv_t<remove_reference_t<T>>.
Let U be remove_reference_t<T>.
If is_array_v<U> is true, the member typedef type equals remove_extent_t<U>*.
If is_function_v<U> is true, the member typedef type equals add_pointer_t<U>.
Otherwise the member typedef type equals remove_cv_t<U>.
If B is true, the member typedef type shall equal T; otherwise, there shall be no member type.
template<bool B, class T, class F>
template<class... T> struct common_type;
Unless this trait is specialized (as specified in Note D, below), there shall be no member type.
If the expression INVOKE(declval<Fn>(), declval<ArgTypes>()...) is well-formed when treated as an unevaluated operand ([expr.context]), the member typedef type names the type decltype(INVOKE(declval<Fn>(), declval<ArgTypes>()...)); otherwise, there shall be no member type.
Access checking is performed as if in a context unrelated to Fn and ArgTypes.
Only the validity of the immediate context of the expression is considered.
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> is X&, otherwise it is T.
The member typedef type of unwrap_ref_decay<T> denotes the type unwrap_reference_t<decay_t<T>>.