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.

### 2838. `is_literal_type` specification needs a little cleanup

Section: D.15 [depr.meta.types] Status: C++17 Submitter: Tim Song Opened: 2016-12-09 Last modified: 2020-09-06

Priority: 0

View all other issues in [depr.meta.types].

View all issues with C++17 status.

Discussion:

D.15 [depr.meta.types]/3 currently reads:

> Effects: `is_literal_type` has a base-characteristic of `true_type` if `T` is a literal type ([basic.types]), and a base-characteristic of `false_type` otherwise.

First, this doesn't seem like an Effects clause. Second, this wording fails to say that `is_literal_type` is an `UnaryTypeTrait`, and misspells `BaseCharacteristic` — which is only defined for `UnaryTypeTraits` and `BinaryTypeTraits`. Third, moving this to Annex D means that the general prohibition against specializing type traits in [meta.type.synop]/1 no longer applies, which is presumably unintended.

[2017-01-27 Telecon]

Priority 0

Proposed resolution:

This wording is relative to N4618.

1. Edit D.15 [depr.meta.types] as indicated:

   > The header `<type_traits>` has the following addition:

   > >     namespace std {
   > >       template <class T> struct is_literal_type;

   > >       template <class T> constexpr bool is_literal_type_v = is_literal_type<T>::value;
   > >     }

   > -2- Requires: `remove_all_extents_t<T>` shall be a complete type or (possibly cv-qualified) `void`.

   > -3- Effects: `is_literal_type` has a base-characteristic of `true_type` if `T` is a literal type (3.9), and a basecharacteristic of `false_type` otherwise `is_literal_type<T>` is a `UnaryTypeTrait` (21.3.2 [meta.rqmts]) with a `BaseCharacteristic` of `true_type` if `T` is a literal type (6.8 [basic.types]), and `false_type` otherwise.

   > -?- The behavior of a program that adds specializations for `is_literal_type` or `is_literal_type_v` is undefined.