7

两者std::is_signed<T>std::numeric_limits<T>::is_signed都应该给出关于 的签名的答案T
为什么现在有两个符号指示符(即从 C++11 开始)?

4

1 回答 1

10

我将冒险猜测唯一的区别是是否std::numeric_limits<T>专门用于用户定义的类型。这样一个用户定义的类型当然可以为is_signed. 但是除非已经独立专门化,否则对这种类型的请求std::is_signed<T>::value将始终返回。falsestd::is_signed<T>

似乎std::is_signed<T>代表的条件是

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

更新:知识渊博的 Howard Hinnant指出,虽然std::numeric_limits<>可以在法律上进行专门化,但<type_traits>除非另有说明,否则不允许专门化任何内容,并且is_signed未指定为可专门化。

因此,std::numeric_limits<T>::is_signed 可能会返回true用户定义的类型(如果它已被专门化),但std::is_signed<T>::value始终会返回false用户定义的类型。

于 2013-03-09T00:48:01.847 回答