constexpr int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
上面的代码片段:
使用 -Wall -Wextra -Wpedantic 在 g++ 7 上编译没有警告。
使用 -Wall -Wextra -Wpedantic 在 clang++ 4 上编译没有警告。
无法在 MSVC 2017 上编译:
conversion from 'const int' to 'unsigned int' requires a narrowing conversion
问:这里 MSVC 是不是错了?
int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
使用 -Wall -Wextra -Wpedantic 在 g++ 7 上编译带有警告:
narrowing conversion of 'i' from 'int' to 'unsigned int'
使用 -Wall -Wextra -Wpedantic 编译 clang++ 4 失败:
non-constant-expression cannot be narrowed from type 'int' to 'unsigned int' in initializer list
无法在 MSVC 2017 上编译:
conversion from 'const int' to 'unsigned int' requires a narrowing conversion
问:这里 g++ 错了吗? (即它应该产生硬错误吗?)
最佳答案
从来没有要求任何 C++ 程序产生硬错误。有打印诊断的要求。标准未指定诊断的形式:一个老笑话是打印出单个空格就满足标准的诊断要求。那将是实现质量问题。
有些格式错误的程序,标准对其行为没有限制,有时是强制诊断。
在某些情况下,程序格式错误并且需要进行诊断。处理该问题的一种方法是生成一条消息,说明这是一个错误,然后不生成任何二进制文件来运行。另一种方法是生成一条消息,说明这是一个警告,然后生成一个可以运行的二进制文件。
因此,g++ 在标准下仅仅打印出警告并没有错。
结果程序在技术上都是未定义的行为; g++ 可以在不违反标准的情况下在运行时格式化您的硬盘驱动器。这将被视为实现质量问题。
Shafik's answer here涵盖了第一个问题。 i 是常量表达式,它的值符合目标类型;不应该有关于缩小转换的警告或错误。
C++ 标准不会保护您免受恶意编译器的侵害。
据报道,-pedantic-errors 可以传递给 g++ 以使其在标准要求生成的程序格式错误时生成硬错误而不是警告。
关于c++ - 缩小从 `int`(常量表达式)到 `unsigned int` 的转换 - MSVC vs gcc vs clang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076106/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是: