This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.

### 2557. Logical operator traits are broken in the zero-argument case

Section: 21.3.9 [meta.logical] Status: C++17 Submitter: Geoffrey Romer Opened: 2015-11-05 Last modified: 2017-07-30

Priority: 0

View all other issues in [meta.logical].

View all issues with C++17 status.

Discussion:

The conjunction trait in 21.3.9 [meta.logical] seems intended to support invocation with zero arguments, e.g. `conjunction<>::value`, which is likely to be a useful feature. However, the specification doesn't actually make sense in the zero-argument case. See 21.3.9 [meta.logical]/p3:

> The BaseCharacteristic of a specialization `conjunction<B1, …, BN>` is the first type `B` in the list `true_type`, `B1`, …, `BN` for which `B::value == false`, or if every `B::value != false` the BaseCharacteristic is `BN`.

If "`B1, ..., BN`" is an empty list, then every `B::value != false`, so the BaseCharacteristic is `BN`, but there is no `BN` in this case.

(If LWG concludes that `conjunction` intentionally requires at least one argument, I would appreciate their confirmation that I can editorially remove the mention of `true_type`, which seems to have no normative impact outside the zero-argument case.)

Similar comments apply to the `disjunction` trait, and to the corresponding traits in the Fundamentals working paper, see LWG 2558.

[2016-02, Issues Telecon]

P0; move to Tentatively Ready.

Proposed resolution:

This wording is relative to N4567.

1. Revise 21.3.9 [meta.logical] as follows:

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

   > > […]

   > > -3- The BaseCharacteristic of a specialization `conjunction<B1, ..., BN>` is the first type `Bi` in the list `true_type, B1, ..., BN` for which `Bi::value == false`, or if every `Bi::value != false`, the BaseCharacteristic is `BN` the last type in the list. [Note: This means a specialization of `conjunction` does not necessarily have a BaseCharacteristic of either `true_type` or `false_type`. — end note]

   > > […]

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

   > > […]

   > > -6- The BaseCharacteristic of a specialization `disjunction<B1, ..., BN>` is the first type `Bi` in the list `false_type, B1, ..., BN` for which `Bi::value != false`, or if every `Bi::value == false`, the BaseCharacteristic is `BN` the last type in the list. [Note: This means a specialization of `disjunction` does not necessarily have a BaseCharacteristic of either `true_type` or `false_type`. — end note]

   > > […]