Proposed resolution:
This wording is relative to N4600.
In [meta.logical] p3, edit as follows:
template<class... B> struct conjunction : see below { };-2- The class template
conjunction
forms the logical conjunction of its template type arguments. Every template type argument shall be usable as a base class and shall have a static data membervalue
which is convertible tobool
, is not hidden, and is unambiguously available in the type.-3- The
BaseCharacteristic of aspecialization 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.
is the first type[Note: This means a specialization of conjunction does not necessarilyB
in the listtrue_type, B1, …, BN
for whichB::value == false
, or ifevery B::value != false
the BaseCharacteristic is the last type in the list.have a BaseCharacteristic ofinherit from eithertrue_type
orfalse_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.
In [meta.logical] p6, edit as follows:
template<class... B> struct disjunction : see below { };-5- The class template
disjunction
forms the logical disjunction of its template type arguments. Every template type argument shall be usable as a base class and shall have a static data membervalue
which is convertible tobool
, is not hidden, and is unambiguously available in the type.-6- The
BaseCharacteristic of aspecialization 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.
is the first type[Note: This means a specialization of disjunction does not necessarilyB
in the listfalse_type, B1, …, BN
for whichB::value != false
, or ifevery B::value == false
the BaseCharacteristic is the last type in the list.have a BaseCharacteristic ofinherit from eithertrue_type
orfalse_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.
In [meta.logical] p8, edit as follows:
template<class B> struct negation :integral_constant<bool, !B::value>see below { };-8- The class template
negation
forms the logical negation of its template type argument. The typenegation<B>
is a UnaryTypeTrait with a BaseCharacteristic ofintegral_constant<bool, !bool(B::value)>
.