The header <tuple> has the following additions:
namespace std {template<class T>struct tuple_size<volatile T>;
template<class T>struct tuple_size<constvolatile T>;
template<size_t I, class T>struct tuple_element<I, volatile T>;
template<size_t I, class T>struct tuple_element<I, constvolatile T>;
}
Let TS denote tuple_size<T> of the cv-unqualified type T.
If the expression TS::value is well-formed
when treated as an unevaluated operand,
then specializations of each of the two templates meet
the Cpp17TransformationTrait requirements with a base characteristic of
integral_constant<size_t, TS::value>.
In addition to being available via inclusion of the <tuple> header,
the two templates are available when any of the headers
<array>,
<ranges>, or
<utility>
are included.
Let TE denote tuple_element_t<I, T>
of the cv-unqualified type T.
Then specializations of each of the two templates meet
the Cpp17TransformationTrait requirements
with a member typedef type that names the following type:
In addition to being available via inclusion of the <tuple> header,
the two templates are available when any of the headers
<array>,
<ranges>, or
<utility>
are included.