23 General utilities library [utilities]

23.15 Metaprogramming and type traits [meta]

23.15.8 Logical operator traits [meta.logical]

В этом подпункте описываются характеристики типа для применения логических операторов к другим характеристикам типа.

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

Шаблон класса conjunction образует логическое соединение аргументов своего типа шаблона.

Для специализации 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 образует логическое разделение аргументов его типа шаблона.

Для специализации 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 { };

Шаблон класса negation представляет собой логическое отрицание аргумента типа шаблона. Тип negation<B> - это UnaryTypeTrait с базовой характеристикой bool_­constant<!bool(B​::​value)>.