Почему перегрузка функций не вызывает неоднозначных ошибок? (с ++)

Этот код компилируется без ошибок в 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;
}

Большое спасибо. Этот код выполнил несколько путаницы на работе. Компилятору можно доверять?

0

Решение

Вы не получаете никаких ошибок компиляции, так как стандарты C ++ говорят, что ваш целочисленный тип должен быть принят и преобразован в double.

Из стандартного §26.8 / 11:

Кроме того, должны быть дополнительные перегрузки, достаточные для обеспечения:
[…] 3. В противном случае, если какой-либо аргумент, соответствующий двойному параметру, имеет тип double или целочисленный тип, то все аргументы, соответствующие двойным параметрам, эффективно приводятся к удвоению.

Также см cppreference.com/…/pow где сказано:

Если какой-либо аргумент имеет целочисленный тип, он приводится к удвоению.

3

Другие решения

Я предполагаю, что вопрос заключается в следующем: «Почему перегрузка функций вызывает ошибку неоднозначности?».

Ответ очень ясен в вашем случае: не существует версии pow (a, b), которая принимает параметр a как целое число. Вместо отображения ошибки компилятор пытается найти версию pow, в котором есть встроенный (или пользовательский) оператор преобразования типов, который может привести int к типу, ожидаемому pow. Бывает, что таких функций 3, и для каждой такой функции есть оператор преобразования. Вот почему компилятор считает это неоднозначным.

0

Так как pow принимает double или float как второй параметр (ваш x). Вот это описание для pow в C ++ 11.

Если вы запустите тот же код на VS2010 в, он тоже выдаст ошибку.

0
По вопросам рекламы ammmcru@yandex.ru