This subclause describes type traits for applying logical operators
to other type traits.

```
template<class... B> struct conjunction : see below { };
```

For a specialization conjunction<B1, ..., BN>,
if there is a template type argument Bi for which bool(Bi::value) is false,
then instantiating conjunction<B1, ..., BN>::value
does not require the instantiation of Bj::value for j > i.

The specialization conjunction<B1, ..., BN>
has a public and unambiguous base that is either

- the first type Bi in the list true_type, B1, ..., BN for which bool(Bi::value) is false, or
- if there is no such Bi, the last type in the list.

```
template<class... B> struct disjunction : see below { };
```

For a specialization disjunction<B1, ..., BN>,
if there is a template type argument Bi for which bool(Bi::value) is true,
then instantiating disjunction<B1, ..., BN>::value
does not require the instantiation of Bj::value for j > i.

The specialization disjunction<B1, ..., BN>
has a public and unambiguous base that is either

- the first type Bi in the list false_type, B1, ..., BN for which bool(Bi::value) is true, or
- if there is no such Bi, the last type in the list.

```
template<class B> struct negation : see below { };
```