#cpp
В книге Шилдта наткнулся на вот такой пример неоднозначности перегруженной функции: #includeusing 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). Поэтому в этом случае возникает неоднозначность.
Комментариев нет:
Отправить комментарий