23 General utilities library [utilities]

23.15 Metaprogramming and type traits [meta]

23.15.8 Logical operator traits [meta.logical]

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

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

The class template conjunction forms the logical conjunction of its template type arguments.

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

The class template disjunction forms the logical disjunction of its template type arguments.

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

The class template negation forms the logical negation of its template type argument. The type negation<B> is a UnaryTypeTrait with a base characteristic of bool_­constant<!bool(B​::​value)>.