草庐IT

c++ - numeric_limits 不适用于引用类型是否有原因?

coder 2024-02-24 原文

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

#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 不知道自己做这个? 我会理解你不想删除指针(因为 char 指针的 maxcharmax 是非常非常不同的东西),但我假设只要你有一个引用作为对 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 的自定义变体,这并不是一个很大的限制。可以在合适的命名空间中创建。

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

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

关于c++ - numeric_limits 不适用于引用类型是否有原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51896941/

有关c++ - numeric_limits 不适用于引用类型是否有原因?的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  5. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  8. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

随机推荐