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