For each tuple assignment operator, an exception is thrown only if the
assignment of one of the types in Types throws an exception.

In the function descriptions that follow, let i be in the range [0, sizeof...(Types))
in order, be the type in Types,
and be the type in a
template parameter pack named UTypes, where indexing is zero-based.

```
tuple& operator=(const tuple& u);
```

```
tuple& operator=(tuple&& u) noexcept(see below);
```

```
template <class... UTypes> tuple& operator=(const tuple<UTypes...>& u);
```

```
template <class... UTypes> tuple& operator=(tuple<UTypes...>&& u);
```

```
template <class U1, class U2> tuple& operator=(const pair<U1, U2>& u);
```

```
template <class U1, class U2> tuple& operator=(pair<U1, U2>&& u);
```