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

smi*_*hax 6 c++ std numeric-limits c++11

双方std::is_signed<T>std::numeric_limits<T>::is_signed应该提供有关的符号性的答案T.
为什么现在有两个签名指标(即自C++ 11以来)?

Lil*_*ard 10

我将冒险猜测唯一的区别是if 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)
Run Code Online (Sandbox Code Playgroud)

更新:总是知识渊博的Howard Hinnant 指出,虽然std::numeric_limits<>可以合法专业,但<type_traits>除非另有说明,否则不允许任何其他内容,并且is_signed未指定为可专门化.

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

  • 这非常接近正确的答案.为你自己的类型专门化`numeric_limits`是合法的,因为第17章说你可以和18.3.2没有说明.但是[meta.type.synop]/p1表示除非另有说明,否则你不能在`<type_traits>`中专门化任何东西,而[meta.unary.prop]也没有为`is_signed`指定.对于类类型,`is_signed`将**总是**为false.如果是专门的,那么`numeric_limits`**可能对于非std类类型是真的. (6认同)
  • Xeo也提出了一个很好的观点,即`is_signed`是一个`integral_constant <bool,value>`,其中`numeric_limits :: is_signed`不是.在使用`integral_constant`重载的函数上进行标记调度是一种常见的习惯用法.所以在那种情况下,`is_signed`是首选工具. (2认同)