std::is_signed<T>
和std::numeric_limits<T>::is_signed
都应该对T
的签名给出答案。
为什么现在有两个签名指标(即从C ++ 11开始)?
答案 0 :(得分:10)
我将冒险猜测唯一的区别是std::numeric_limits<T>
是否专门用于用户定义的类型。这种用户定义的类型当然可以为is_signed
提供自己的值。但是,在此类型上询问std::is_signed<T>::value
将始终返回false
,除非std::is_signed<T>
已被独立专业化。
似乎std::is_signed<T>
代表的条件是
is_arithmetic<T>::value && T(-1) < T(0)
更新:始终知情的Howard Hinnant points out虽然std::numeric_limits<>
可以合法专业,但<type_traits>
中的任何内容都不允许专门用于其他内容,除非另有说明指定,并且is_signed
未指定为可特殊化。
因此,std::numeric_limits<T>::is_signed
可以为用户定义的类型返回true
(如果已经专门化),但std::is_signed<T>::value
将始终返回false
用户定义的类型。