【问题标题】:Is there a reason why numeric_limits do not work on reference types?numeric_limits 对引用类型不起作用是否有原因?
【发布时间】:2019-01-24 14:06:47
【问题描述】:

如果你错误地做了类似的事情:

#include<limits>
int arr[3];
auto x  = std::numeric_limits<decltype(arr[0])>::max();

您将从 STL 实现中的文件中获得无用的错误消息。

问题是模板参数是一个引用,所以解决方法是删除它:

auto x  = std::numeric_limits<std::remove_reference_t<decltype(arr[0])>>::max();

现在我的问题是为什么numeric_limits 不知道自己做这个? 我会理解您不想删除指针(因为 maxchar 指针和 charmax 是非常不同的东西),但我会假设每当你有一个引用作为参数numeric_limits 你会很高兴通过删除它获得结果。

【问题讨论】:

  • 您想要一个因为标准这么说的答案,还是在寻找委员会决定不定义std::numeric_limits&lt;int&amp;&gt; 的原因?
  • 我想知道这是否只是一个“懒惰”的标准,还是存在语言限制会导致问题的实现,因为我认为它应该是......
  • 我认为这归结为这对指针的意义。引用可以实现为指针,因此它应该限制它可以保存的地址或它所引用的东西的限制。我真的没有一个好的答案。
  • 虽然它可能有用,但定义引用的数字限制似乎没有意义。 int&amp; 更像是指向 int 的指针,而不是 int 本身。
  • 我同意你的观点,让 numeric_limit 或 numeric_limit 等同于 numeric_limit 是有意义的,这样它可以与 sizeof、alignof、typeid、tuple_size 保持一致, 元组元素。

标签: c++ templates numeric-limits


【解决方案1】:

从技术角度来看,std::numeric_limits&lt;T&gt; 没有理由不能与引用一起使用。添加这样的部分专业化所需的所有内容:

namespace std {
    template <typename T> struct numeric_limits<T&>: numeric_limits<T> {};
    template <typename T> struct numeric_limits<T&&>: numeric_limits<T> {};
    template <typename T> struct numeric_limits<T const>: numeric_limits<T> {};
    template <typename T> struct numeric_limits<T volatile>: numeric_limits<T> {};
    template <typename T> struct numeric_limits<T const volatile>: numeric_limits<T> {};
}

当然,用户不能添加这些专业。但是,这并不是一个很大的限制,因为可以在合适的命名空间中创建 numeric_limits 的自定义变体。

由于它在技术上是可行的,现在问题变成了为什么标准不提供这些声明。我认为不会有一个决定性的答案(除非这个想法被讨论并丢弃了一个合适且仍然可以访问的记录)。以下是一些可能的答案:

  1. 未提出该功能。当 std::numeric_limits 被引入时,它专门针对用更 C++ 的方法替换 &lt;limits.h&gt; 中的宏。 decltype(expr) 之类的东西和转发引用不存在,即模板参数不会被“意外”推断为引用类型。因此,删除限定符在当时并不是一个问题。
  2. 我不确定在历史上添加numeric_limits 时是否已经存在部分模板专业化。即使它存在,任何类似模板元编程的东西都不存在。因此,可能不可能或假定不可能以必要的方式干预模板参数类型。
  3. 即使考虑了,我怀疑委员会是否会添加部分专业化:numeric_limits&lt;T&gt; 检查T 类型的特征,但引用类型没有max()digits。此外,如果支持引用类型,因为“显然”所需的属性必须是停止的基础类型之一:std::numeric_limits&lt;int*&gt;::max() 是否也应该提供与std::numeric_limits&lt;int&gt;::max() 相同的值?毕竟,它对指针也没有任何意义。
  4. 考虑到最初的提案几乎肯定没有涵盖合格类型的情况(见上文),该功能不可用的另一个原因是它根本没有被提出:没有提案,标准不会换衣服。如果提出该功能,标准是否会改变是一个单独的问题。在这个通用空间 (P0437r0) 中有一个提案,但浏览它我认为这个提案也不涵盖合格的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多