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

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

The specialization conjunction<, …, >
has a public and unambiguous base that is either

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

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

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

The specialization disjunction<, …, >
has a public and unambiguous base that is either

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

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