簡體   English   中英

為什么GCC打破用短參數調用abs函數的代碼?

[英]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 ++標准。

麻煩是由這個條款造成的:

此外,還應有足夠的額外過載來確保:

  1. 如果對應於double參數的任何算術參數具有long double類型,則對應於double參數的所有算術參數都被有效地轉換為long double。

  2. 否則,如果對應於double參數的任何算術參數具有double類型或整數類型 ,則對應於double參數的所有算術參數將被有效地轉換為double。

  3. 否則,對應於double參數的所有算術參數都具有float類型。

short int是“整數類型”,因此bullet#2啟動並導致生成一個調用double abs(double)包裝器,這個包裝器比int abs(int)更好。

值得注意的是,標准的最新草案在此規則中添加了明確的例外:

對於除了abs之外的每組重載函數,應該有足夠的額外過載來確保:

此異常實際上是從處理無符號類型派生的,但也解決了您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM