Объяснение неоднозначности в перегрузке функций для этого примера в C ++ - PullRequest
1 голос
/ 26 июня 2010

Я читаю книгу Страуструпа, раздел о перегрузках и связанных с этим неясностях.

Есть следующий пример:

void f1(char);
void f1(long);

void k(int i)
{
    f1(i);    //ambiguous: f1(char) or f1(long)
}

Как говорится в комментарии, вызов неоднозначен. Почему?

В предыдущем разделе книги изложено 5 правил, основанных на сопоставлении формальных и фактических параметров. Так не должен ли вышеуказанный вызов функции соответствовать правилу 2, касающемуся «продвижения по службе»? Я предположил, что «я» должен быть повышен до длинного, и это все.

Согласно комментарию, кажется, что преобразование int в char (понижение?) Также подпадает под правило 2?

Ответы [ 2 ]

6 голосов
/ 26 июня 2010

Все, что идет от int выше, больше не является рекламой. Все, что идет от int до int, является рекламой (за исключением редких случаев - см. Ниже)

Таким образом, если вы перейдете к следующему, оно станет не однозначным, выбрав первый

void f1(int);
void f1(long);

void k(unsigned short i) {
    f1(i);
}

Обратите внимание, что это верно только для платформ, где int может хранить все значения unsigned short. На платформах, где это не так, это не будет рекламой и вызов неоднозначен. На таких платформах целью продвижения будет тип unsigned int.

То же самое происходит с плавающей точкой. Преобразование float в double - это повышение, но double в long double не является повышением. В этом случае C ++ отличается от C, где double до long double также является повышением (однако в любом случае не имеет перегрузки).

0 голосов
/ 26 июня 2010

Int может быть преобразовано в символ, а int также может быть преобразовано в long.

Так что в этом смысле это неоднозначно, так как компилятор не может определить, что вы вызываете.

...