代码之家  ›  专栏  ›  技术社区  ›  NoSenseEtAl

是否有原因说明数值限制对引用类型不起作用?

  •  4
  • NoSenseEtAl  · 技术社区  · 6 年前

    如果你错误地做了如下事情:

    #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 我知道你不想删除pointerness(因为 max 属于 char 指针和 最大值 烧焦 是非常不同的事情),但我假设每当你有一个引用作为论据 数值限制

    1 回复  |  直到 6 年前
        1
  •  3
  •   Dietmar Kühl    6 年前

    从技术角度来看,没有理由 std::numeric_limits<T> 无法处理引用。所有需要它来添加这样的部分专业:

    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 是专门用来替换 <limits.h> 用一个更为C++的方法。有点像 decltype(expr) 转发引用不存在,也就是说,模板参数不会“意外”地作为引用类型推导出来。因此,删除限定符在当时并不重要。
    2. 数值限制 已添加部分模板专业化。即使它存在,任何类似于模板元编程的东西都不存在。因此,可能无法或假定无法以必要的方式处理模板参数类型。
    3. numeric_limits<T> 检查类型的特征 T max() digits . 此外,如果支持引用类型,因为“显然”所需的属性必须是要停止的基础类型之一:should std::numeric_limits<int*>::max() 提供与 std::numeric_limits<int>::max() ,也是吗?毕竟,在指针上也没有任何意义。
    4. 考虑到最初的提议几乎肯定没有涵盖限定类型的情况(见上文),功能不可用的另一个原因是它根本没有被提议:没有提议,标准就不会改变。如果特征被提出,标准是否会改变是一个单独的问题。在这个大空间里有一个提议( P0437r0 )但浏览一下,我认为这个提议也不包括合格的类型。