c – 为什么numeric_limits不能用于引用类型?
如果你错误地做了类似的事情:
#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不知道自己做这个? 解决方法
从技术角度来看,没有理由为什么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)和转发引用这样的东西不存在,即模板参数不会被“意外地”推断为引用类型.因此,当时不需要删除限定符. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |