#include <cmath> #include <cstdlib> int main() { short int k = 11; switch(std::abs(k)) { case 44: return 5; break; } }
上面的代码在GCC 4.4.7和7.1及更高版本中工作正常.
它在GCC 4.5.4及更高版本中出错:
<source>: In function 'int main()': <source>:7:23: error: switch quantity not an integer
所以我的问题是为什么GCC引入了这个突破性的变化?
或者,实施者是否意识到这是一个重大改变?如果是这样,为什么他们如何测试他们不破坏现有代码?
这个问题也可以针对Clang,因为它与abs函数有类似的问题.
解决方法
麻烦是由这个条款造成的:
Moreover,there shall be additional overloads suffcient to ensure:
@H_301_25@
If any arithmetic argument corresponding to a double parameter has type long double,then all arithmetic arguments corresponding to
@H_301_25@
double parameters are effectively cast to long double.Otherwise,if any arithmetic argument corresponding to a double parameter has type double or an integer type,then all arithmetic
@H_301_25@
arguments corresponding to double parameters are effectively cast to
double.Otherwise,all arithmetic arguments corresponding to double parameters have type float.
short int是“整数类型”,因此bullet#2启动并导致生成一个调用double abs(double)的包装器,这个包装器比int abs(int)更好.
值得注意的是,标准的最新草案在此规则中添加了明确的例外:
For each set of overloaded functions within,with the exception of
abs
,there shall be additional overloads suffcient to ensure:
此异常实际上源自handling of unsigned types,但也解决了您的问题.