2197. Specification of is_[un]signed unclear for non-arithmetic types

Section: 21.3.5.4 [meta.unary.prop] Status: C++14 Submitter: Daniel Krügler Opened: 2012-10-07 Last modified: 2016-01-28

Priority: Not Prioritized

View other active issues in [meta.unary.prop].

View all other issues in [meta.unary.prop].

View all issues with C++14 status.

Discussion:

The pre-conditions for the trait is_signed allow for any types as template arguments, including non-arithmetic ones.

But the current wording in Table 49 defining the predicate condition,

is_arithmetic<T>::value && T(-1) < T(0)

looks like real code and so leaves it open whether such argument types would create a well-formed instantiation of the trait template or not. As written this definition would lead to a hard instantiation error for a non-arithmetic type like e.g.

struct S {};

I would suggest that the wording clarifies that the instantiation would be valid for such types as well, by means of a specification that is not an exact code pattern. This also reflects how existing implementations behave.

[2013-03-15 Issues Teleconference]

Moved to Tentatively Ready.

[2013-04-20 Bristol]

Proposed resolution:

This wording is relative to N3376.

  1. Change Table 49 as indicated:

    Table 49 — Type property predicates
    Template Condition Preconditions
    template <class T>
    struct is_signed;
    If is_arithmetic<T>::value && is true, the same result as
    integral_constant<bool, T(-1) < T(0)>::value;
    otherwise, false.
     
    template <class T>
    struct is_unsigned;
    If is_arithmetic<T>::value && is true, the same result as
    integral_constant<bool, T(0) < T(-1)>::value;
    otherwise, false.