2514. Type traits must not be final

Section: 21.3.2 [meta.rqmts] Status: C++17 Submitter: Jonathan Wakely Opened: 2015-07-03 Last modified: 2017-07-30

Priority: 3

View all other issues in [meta.rqmts].

View all issues with C++17 status.

Discussion:

We should make it clear that all standard UnaryTypeTraits, BinaryTypeTraits and TransformationTraits are not final.

Otherwise it is not safe to use them as arguments to a template like this:

template<typename C1, typename C2>
struct conjunction
  : conditional_t<C1::value, C2, C1>
{ };

[2016-08-03 Chicago LWG]

Walter, Nevin, and Jason provide initial Proposed Resolution.

Previous resolution [SUPERSEDED]:

This wording is relative to N4606.

  1. Change 21.3.2 [meta.rqmts] as indicated:

    -1- A UnaryTypeTrait describes a property of a type. It shall be a non-final class template […]

    -2- A BinaryTypeTrait describes a relationship between two types. It shall be a non-final class template […]

    -3- A TransformationTrait modifies a property of a type. It shall be a non-final class template […]

[2016-08-04 Chicago LWG]

LWG discusses and expresses preference for a more general, Library-wide, resolution. Walter and Nevin provide a new Proposed Resolution consistent with such guidance.

[2016-08 - Chicago]

Thurs PM: Moved to Tentatively Ready

Proposed resolution:

This wording is relative to N4606.

  1. Add a new paragraph add the end of 16.4.6.12 [derivation] as indicated:

    -?- All types specified in the C++ standard library shall be non-final types unless otherwise specified.