Created on 2019-09-27.00:00:00 last changed 45 months ago
Proposed resolution:
This wording is relative to N4835.
Change Table 52 — "Sign modifications" in [tab:meta.trans.sign] as indicated:
Template | Comments |
---|---|
template <class T> struct make_signed; |
If T names a (possibly cv-qualified) signed integer type ([basic.fundamental]) then the member typedef type names the type T; otherwise, if T names a (possibly cv-qualified) unsigned integer type then type names the corresponding signed integer type, with the same cv-qualifiers as T; otherwise, type names the signed integer type with smallest rank ([conv.rank]) for which sizeof(T) == sizeof(type), with the same cv-qualifiers as T. |
template <class T> struct make_unsigned; |
If T names a (possibly cv-qualified) unsigned integer type ([basic.fundamental]) then the member typedef type names the type T; otherwise, if T names a (possibly cv-qualified) signed integer type then type names the corresponding unsigned integer type, with the same cv-qualifiers as T; otherwise, type names the unsigned integer type with smallest rank ([conv.rank]) for which sizeof(T) == sizeof(type), with the same cv-qualifiers as T. |
Change [iterator.range] as indicated:
template<class C> constexpr auto ssize(const C& c) -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;-18-
ReturnsEffects: Equivalent to:return static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>>(c.size());
[ 2019-11-23 Issue Prioritization ]
Status to Tentatively Ready after five positive votes on the reflector.
[ 2019-11-18; Casey comments and improves wording ]
It would be better to provided the Mandates: guarantee in [tab:meta.trans.sign] instead of one special place where the make_signed template is used. The wording below attempts to realize that.
[ 2019-10-28; Tim provides improved wording ]
Previous resolution [SUPERSEDED]:
This wording is relative to N4835.
Modify [iterator.range] as indicated:
template<class C> constexpr auto ssize(const C& c) -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;-?- Mandates: decltype(c.size()) is an integral or enumeration type other than bool.
-18- Returns:static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>>(c.size())
[ 2019-11-16 Issue Prioritization ]
Priority to 3 after reflector discussion.
Previous resolution [SUPERSEDED]:
This wording is relative to N4830.
Modify [iterator.range] as indicated:
template<class C> constexpr auto ssize(const C& c) -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>;-?- Mandates: decltype(c.size()) is a (possibly cv-qualified) integral or enumeration type but not a bool type.
-18- Returns:static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>>(c.size())
The overload of ssize specified in [iterator.range]/18 has no constraints, yet it specializes make_signed_t which has a precondition that its type parameter is an integral type or enumeration but not bool ([meta.trans.sign]). This precondition needs to be propagated to ssize as "Mandates [or Constraints]: decltype(c.size()) [meets the requirements for the type argument to make_signed]". "Mandates" seems to be more in line with LWG guidance since there are no traits nor concepts that observe ssize.
History | |||
---|---|---|---|
Date | User | Action | Args |
2021-02-25 10:48:01 | admin | set | status: wp -> c++20 |
2020-02-24 16:02:59 | admin | set | status: voting -> wp |
2020-01-17 04:54:50 | admin | set | status: ready -> voting |
2019-11-23 16:16:34 | admin | set | messages: + msg10842 |
2019-11-23 16:16:34 | admin | set | status: new -> ready |
2019-11-18 20:24:14 | admin | set | messages: + msg10827 |
2019-11-16 13:01:46 | admin | set | messages: + msg10813 |
2019-11-16 13:01:46 | admin | set | messages: + msg10812 |
2019-10-09 18:10:13 | admin | set | messages: + msg10690 |
2019-09-27 00:00:00 | admin | create |