В этом подпункте описываются характеристики типа для применения логических операторов к другим характеристикам типа.
template<class... B> struct conjunction : see below { };
Для специализации conjunction<B1, ..., BN>, если есть аргумент типа шаблона, Bi для которого bool(Bi::value) есть false, то создание экземпляра conjunction<B1, ..., BN>::value не требует создания экземпляра Bj::value for j > i. [ Note: Это аналогично короткому замыканию встроенного оператора &&. ] — end note
Каждый аргумент типа шаблона, для которого Bi::value создается экземпляр, должен использоваться как базовый класс и должен иметь член, value который может быть преобразован bool, не скрыт и однозначно доступен в типе.
Специализация conjunction<B1, ..., BN> имеет публичную и однозначную базу, которая либо
первый тип Bi в списке, true_type, B1, ..., BN для которого bool(Bi::value) есть false, или
если такого нет Bi, то последний тип в списке.
[ Note: Это означает, что специализация conjunction не обязательно наследуется от true_type или false_type. ] — end note
Имена членов базового класса, отличные от conjunction и operator=, не должны быть скрыты и должны быть однозначно доступны в conjunction.
template<class... B> struct disjunction : see below { };
Для специализации disjunction<B1, ..., BN>, если есть аргумент типа шаблона, Bi для которого bool(Bi::value) есть true, то создание экземпляра disjunction<B1, ..., BN>::value не требует создания экземпляра Bj::value for j > i. [ Note: Это аналогично короткому замыканию встроенного оператора ||. ] — end note
Каждый аргумент типа шаблона, для которого Bi::value создается экземпляр, должен использоваться как базовый класс и должен иметь член, value который может быть преобразован bool, не скрыт и однозначно доступен в типе.
Специализация disjunction<B1, ..., BN> имеет публичную и однозначную базу, которая либо
первый тип Bi в списке, false_type, B1, ..., BN для которого bool(Bi::value) есть true, или
если такого нет Bi, то последний тип в списке.
[ Note: Это означает, что специализация disjunction не обязательно наследуется от true_type или false_type. ] — end note
Имена членов базового класса, отличные от disjunction и operator=, не должны быть скрыты и должны быть однозначно доступны в disjunction.
template<class B> struct negation : see below { };