Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Неоднозначность перегруженной функции в C++

#cpp


В книге Шилдта наткнулся на вот такой пример неоднозначности перегруженной функции:

#include 

using namespace std;

char myfunc(unsigned char ch);
char myfunc(char ch);

int main()
{
 cout << myfunc('c'); // Здесь вызывается myfunc(char).
 cout << myfunc(88) << " "; // Вносится неоднозначность.
 return 0;
}

char myfunc(unsigned char ch)
{
 return ch-1;
}

char myfunc(char ch)
{
 return ch+1;
}


Не могу понять, почему не возникает неоднозначности когда аргументов является 'c'?
Ведь для него подходят обе функции.
    


Ответы

Ответ 1



'c' - это символьная константа, соответствующая типу char, а для ее приведения к типу unsigned char необходимо преобразование. А 88 - это целочисленная константа соответствующая типу int, для ее приведения как к типу char, так и к типу unsinged char требуется преобразование.

Ответ 2



Литерал 'c' имеет тип char, а не unsigned char. Типы char, signed char, unsigned char - это три разных типа: std::is_same::value //false std::is_same::value //false Соответственно для вызова с аргументом типа char никаких преобразований не нужно и будет выбрана char myfunc(char ch); Что касается неоднозначности с аргументом типа int, то неясно, приводить аргумент к типу char или типу unsigned char.

Ответ 3



Вопрос тут не в том, "подходят" или "не подходят" обе функции, а в том, есть ли среди всех подходящих функций одна единственная однозначно лучшая чем остальные, согласно правилам overload resolution. В случае myfunc('c') такая функция есть - это char myfunc(char ch), ибо тип ее параметра charв точности совпадает с типом предоставленного аргумента 'с'. В этом случае неоднозначности нет. В случае myfunc(88) обе имеющиеся функции одинаково хороши (или одинаково "плохи"), ибо обе требуют преобразования типа аргумента и в обоих случаях преобразования фактически одинаковы (int -> char и int -> unsiged char). Поэтому в этом случае возникает неоднозначность.

Комментариев нет:

Отправить комментарий