【问题标题】:Difference between std::is_signed<T> and std::numeric_limits<T>::is_signed?std::is_signed<T> 和 std::numeric_limits<T>::is_signed 之间的区别?
【发布时间】:2023-04-11 00:49:02
【问题描述】:

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

【问题讨论】:

  • std::is_signed&lt;T&gt; 是一个类型,而 std::numeric_limits&lt;T&gt;::is_signed 成员只是一个值。在元编程中,使用前者更方便,也更一致。
  • 实际上你会在实践中使用std::is_signed&lt;T&gt;::value。你会在哪里直接使用std::is_signed&lt;T&gt;
  • 但是他们的结果有区别吗?
  • @Kevin:你对类型特征做了多少元编程?
  • @KevinBallard,您经常希望将诸如is_signed 的元函数传递给另一个元函数,例如applyand_,而不是检查“结果”(即其value 成员) 立即

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


【解决方案1】:

我会冒险猜测,唯一的区别是std::numeric_limits&lt;T&gt; 是否专门用于用户定义的类型。这样一个用户定义的类型当然可以为is_signed 提供它们自己的值。但是在这种类型上请求std::is_signed&lt;T&gt;::value 将始终返回false,除非std::is_signed&lt;T&gt; 已经独立专门化。

std::is_signed&lt;T&gt; 所代表的条件似乎是

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

更新:知识渊博的 Howard Hinnant points out 表示,虽然 std::numeric_limits&lt;&gt; 可以合法专业化,但除非另有说明,否则 &lt;type_traits&gt; 中的任何内容都不允许专业化,is_signed未指定为可特化的。

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

【讨论】:

  • 您能否将std::numeric_limits&lt;T&gt; 专门用于用户定义的类型?在 C++03 中,用户向命名空间 std 添加任何内容都是非法的。 C++11 的限制是否已解除?
  • @DavidHammen:不,有限制,但不适用于专业化。您可以在 std 中专门化现有模板,但您不能添加自己的东西。
  • @DavidHammen :在命名空间std 中完全特化模板始终是合法的,只是不能部分特化类模板或重载函数/函数模板。
  • 这真的很接近正确答案。将numeric_limits 专门用于您自己的类型是合法的,因为第 17 章说您可以,而 18.3.2 并没有另外规定。但是 [meta.type.synop]/p1 说你不能专门化 &lt;type_traits&gt; 中的任何内容,除非另有说明,并且 [meta.unary.prop] 没有为 is_signed 指定其他内容。对于类类型,is_signed总是为 false。 numeric_limits 可能如果专门用于非标准类类型。
  • Xeo 还指出is_signedintegral_constant&lt;bool, value&gt;,而numeric_limits::is_signed 不是。对integral_constant 重载的函数进行标记调度是一种常见的习惯用法。因此,在这种情况下,is_signed 是首选工具。
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 2016-01-19
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多