[英]Why did GCC break code that calls abs function with short argument?
#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函數有類似的問題。
GCC(和clang)庫(分別是glibc和libc ++)打破了向后兼容性,以符合C ++標准。
麻煩是由這個條款造成的:
此外,還應有足夠的額外過載來確保:
如果對應於double參數的任何算術參數具有long double類型,則對應於double參數的所有算術參數都被有效地轉換為long double。
否則,如果對應於double參數的任何算術參數具有double類型或整數類型 ,則對應於double參數的所有算術參數將被有效地轉換為double。
否則,對應於double參數的所有算術參數都具有float類型。
short int
是“整數類型”,因此bullet#2啟動並導致生成一個調用double abs(double)
包裝器,這個包裝器比int abs(int)
更好。
值得注意的是,標准的最新草案在此規則中添加了明確的例外:
對於除了
abs
之外的每組重載函數,應該有足夠的額外過載來確保:
此異常實際上是從處理無符號類型派生的,但也解決了您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.