This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [v3] C++0x type_traits post-oxford additions


On May 7, 2007, at 10:13 AM, Benjamin Kosnik wrote:


make_signed/make_unsigned require:
Requires: T is a cv integral type or enumeration, but not a bool type.
I.e. they are not supposed to work with floating point types.

Huh. Now that I look at this, I'm wondering why is_signed/ is_unsigned work on all arithematic types where T(-1) < T(0), and make_signed/make_unsigned only work on all integral types except bool plus enumerated types? What's the reason for the inconsistency?


I don't see this in the rationale.

For is_(un)signed the motivation for including floating point types is:


* Consistency with numeric_limits<T>::is_signed

* Because asking if an arithmetic types supports negative values is a reasonable question with a well defined answer for all arithmetic types.

For make_(un)signed floating point types were not included because:

* I wasn't aware of any use cases.

* The semantics of make_signed<double>::type and make_unsigned<double>::type didn't seem obviously clear.

* As I recall when I surveyed my own implementation, and other implementations I found, no one had applied this functionality to floating point types (so no existing practice).

* make_(un)signed<long double> seems fragile / non-portable.

That being said, please feel free to send me a defect report if you would like to see make_(un)signed applied to floating point types.

-Howard



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]