2013-06-23 25 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中运行相同的代码,也会发出错误。