The header <tuple> has the following additions:
namespace std {
template<class T> struct tuple_size<volatile T>;
template<class T> struct tuple_size<const volatile T>;
template<size_t I, class T> struct tuple_element<I, volatile T>;
template<size_t I, class T> struct tuple_element<I, const volatile T>;
}

```
template<class T> struct tuple_size<volatile T>;
template<class T> struct tuple_size<const volatile 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>.

Otherwise, they have no member value.

```
template<size_t I, class T> struct tuple_element<I, volatile T>;
template<size_t I, class T> struct tuple_element<I, const volatile T>;
```

Then specializations of each of the two templates meet
the *Cpp17TransformationTrait* requirements
with a member typedef type that names the following type:

- for the first specialization, add_volatile_t<TE>, and
- for the second specialization, add_cv_t<TE>.