0

此代码在 gcc 4.6.1 和 4.8.1 中编译没有错误( eclipse 自动编译说:候选人是:float pow(float, int) long double pow(long double, int) double pow(double, int) ):

#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;
}

非常感谢。这段代码在工作中做了一些很好的混淆。编译器可以信任吗?

4

3 回答 3

3

您不会收到任何编译错误,因为 C++ 标准规定您的整数类型将被接受并转换为双精度。

根据标准§26.8/11:

此外,应有足够的额外重载以确保:
[...]
3. 否则,如果对应于 double 参数的任何参数具有 double 类型或整数类型,则对应于 double 参数的所有参数都有效地转换为 double。

另请参阅cppreference.com/.../pow它说:

如果任何参数具有整数类型,则将其强制转换为 double。

于 2013-06-23T20:10:23.847 回答
0

因为pow接受 adouble或 afloat作为第二个参数(你的x)。powC++11 中的描述。

如果您在 VS2010 上运行相同的代码也会发出错误。

于 2013-06-23T20:18:30.727 回答
0

我假设问题是:“为什么函数重载会导致歧义错误?”。

在您的情况下,答案非常清楚:没有任何版本的 pow(a, b) 接受参数 a 作为整数。编译器不会显示错误,而是尝试查找具有内置(或自定义)类型转换运算符的 pow 版本,该运算符可以将 int 转换为 pow 期望的类型。碰巧有 3 个这样的函数,每个这样的函数都有一个转换运算符。这就是编译器认为它模棱两可的原因。

于 2013-06-23T20:15:31.093 回答