NoS*_*tAl 6 c++ templates numeric-limits
如果您错误地执行以下操作:
#include<limits>
int arr[3];
auto x = std::numeric_limits<decltype(arr[0])>::max();
Run Code Online (Sandbox Code Playgroud)
您将从 STL 实现中的文件中获得无用的错误消息。
问题是模板参数是一个引用,所以修复是删除它:
auto x = std::numeric_limits<std::remove_reference_t<decltype(arr[0])>>::max();
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么numeric_limits不知道自己做这个?我明白,你不想删除pointerness(因为max的char指针max的char是非常非常不同的东西),但我认为,只要你有一个参考作为参数传递给numeric_limits你非常乐意与被删除它得到的结果.
从技术角度来看,没有理由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> {};
}
Run Code Online (Sandbox Code Playgroud)
当然,用户无法添加这些专业。然而,这并不是一个巨大的限制,因为numeric_limits可以在合适的命名空间中创建自定义变体。
由于它在技术上是可行的,现在的问题是为什么该标准不提供这些声明。我认为不会有一个结论性的答案(除非这个想法已经被讨论并被合适的且仍然可访问的记录所抛弃)。以下是一些可能的答案:
std::numeric_limits替换宏。<limits.h>诸如decltype(expr)和 转发引用之类的东西不存在,即模板参数不会“意外地”被推导为引用类型。因此,删除限定符当时并不是一个问题。numeric_limits添加部分模板专业化时是否已经存在。即使存在,类似模板元编程的东西也不存在。因此,可能不可能或假设不可能以必要的方式干预模板参数类型。numeric_limits<T>检查类型的特征T,但引用类型没有max()or digits。另外,如果支持引用类型,因为“显然”所需的属性必须是停止的基础类型之一:也应该std::numeric_limits<int*>::max()提供与 相同的值std::numeric_limits<int>::max()吗?毕竟,它对指针也没有任何意义。