2013-06-23 24 views
0

這段代碼在gcc 4.6.1和4.8.1中編譯時沒有錯誤(eclipse auto compilation說:候選者是:float pow(float,int)long double pow(long double, int)double pow(double ,int)):爲什麼函數重載不會導致模糊的錯誤? (C++)

#include <iostream> 
#include <cmath> 
#include <vector> 
using namespace std; 

int main(void) { 
    const int i = 0, x = 2; 
    double y = pow(i, x); 
    y = log(i)/log(x); 
    cout << y; 
return 0; 
} 

非常感謝。這段代碼在工作中表現了一些不錯的混淆。編譯器可以被信任?

+3

這裏有什麼問題? – catfood

+0

如果有疑問,請相信編譯器並忘記eclipse – djf

+0

您的程序的(中間)目標是什麼,以取悅eclipse或進行編譯? – PlasmaHH

回答

3

您不會收到任何編譯錯誤,因爲C++標準規定您的整數類型將被接受並轉換爲double。

從標準§26.8/ 11:

此外,存在應足以確保附加重載:
[...]
3.否則,如果對應於一個雙參數任何參數具有double類型或整數類型,那麼對應於double參數的所有參數將被有效地轉換爲double。

另見cppreference.com/.../pow,它說:

如果任何參數有整型,它被轉換爲加倍。

+0

我相信這實際上是一個缺陷報告的主題。 –

+0

@BenVoigt你的意思是在eclipse中? – Pixelchemist

+0

不,我的意思是規則。事實上,如果我理解正確,實施它將成爲不可維護的模板災難。也很不直觀,因爲規則與正常的內置轉換不一致。 –

0

我假設問題是:「爲什麼函數重載導致模糊錯誤?」。

答案在你的案例中非常清楚:沒有任何版本的pow(a,b)接受參數a作爲整數。編譯器不是顯示一個錯誤,而是試圖找到一個pow的版本,其中有一個內置(或自定義)類型轉換運算符,可以將int轉換爲pow類型所期望的。碰巧有3個這樣的函數,並且每個這樣的函數都有一個轉換運算符。這就是編譯器發現它不明確的原因。

+1

編譯器沒有發現它是模糊的... – PlasmaHH

0

因爲pow接受doublefloat作爲第二個參數(您的x)。 Here是C++ 11中pow的描述。

如果您在VS2010中運行相同的代碼,也會發出錯誤。