std :: is_signed <t>和std :: numeric_limits <t> :: is_signed之间的区别?</t> </t>

时间:2013-03-09 00:34:14

标签: c++ c++11 std numeric-limits

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

1 个答案:

答案 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用户定义的类型。