Этот код компилируется без ошибок в 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;
}
Большое спасибо. Этот код выполнил несколько путаницы на работе. Компилятору можно доверять?
Вы не получаете никаких ошибок компиляции, так как стандарты C ++ говорят, что ваш целочисленный тип должен быть принят и преобразован в double.
Из стандартного §26.8 / 11:
Кроме того, должны быть дополнительные перегрузки, достаточные для обеспечения:
[…] 3. В противном случае, если какой-либо аргумент, соответствующий двойному параметру, имеет тип double или целочисленный тип, то все аргументы, соответствующие двойным параметрам, эффективно приводятся к удвоению.
Также см cppreference.com/…/pow где сказано:
Если какой-либо аргумент имеет целочисленный тип, он приводится к удвоению.
Я предполагаю, что вопрос заключается в следующем: «Почему перегрузка функций вызывает ошибку неоднозначности?».
Ответ очень ясен в вашем случае: не существует версии pow (a, b), которая принимает параметр a как целое число. Вместо отображения ошибки компилятор пытается найти версию pow, в котором есть встроенный (или пользовательский) оператор преобразования типов, который может привести int к типу, ожидаемому pow. Бывает, что таких функций 3, и для каждой такой функции есть оператор преобразования. Вот почему компилятор считает это неоднозначным.
Так как pow
принимает double
или float
как второй параметр (ваш x
). Вот это описание для pow
в C ++ 11.
Если вы запустите тот же код на VS2010 в, он тоже выдаст ошибку.