`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* { };

The class template negation
forms the logical negation of its template type argument.

The type negation<B>
is a *Cpp17UnaryTypeTrait* with a base characteristic of bool_constant<!bool(B::value)>.