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. [βNote: This is analogous to the short-circuiting behavior of the built-in operator &&. βββend noteβ]
Every template type argument for which Biβ::βvalue is instantiated shall be usable as a base class and shall have a member value which is convertible to bool, is not hidden, and is unambiguously available in the type.
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.
[βNote: This means a specialization of conjunction does not necessarily inherit from either true_Βtype or false_Βtype. βββend noteβ]
The member names of the base class, other than conjunction and operator=, shall not be hidden and shall be unambiguously available in conjunction.
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. [βNote: This is analogous to the short-circuiting behavior of the built-in operator ||. βββend noteβ]
Every template type argument for which Biβ::βvalue is instantiated shall be usable as a base class and shall have a member value which is convertible to bool, is not hidden, and is unambiguously available in the type.
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.
[βNote: This means a specialization of disjunction does not necessarily inherit from either true_Βtype or false_Βtype. βββend noteβ]
The member names of the base class, other than disjunction and operator=, shall not be hidden and shall be unambiguously available in disjunction.
template<class B> struct negation : see below { };