Этот пример сводится к различию между Integer Promotion и Integer Conversion. Продвижение, короче:
A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int. [...] These conversions are called integral promotions.
, тогда как целое число преобразование является более общим:
A prvalue of an integer type can be converted to a prvalue of another integer type. [...] The conversions allowed as integral promotions are excluded from the set of integral conversions.
Неотъемлемого продвижением является лучше, чем преобразования интегрального преобразования для целей разрешения перегрузки.
В первом примере мы имеем:
add(int); // (1)
add(double); // (2)
add(int*); // (3)
и призывают с char
. Только первые два являются жизнеспособными, оба связаны с конверсией. (1) включает в себя Integer Promotion, который имеет рейтинг Promotion. (2) включает в себя плавающее интегральное преобразование, которое имеет ранговое преобразование. Продвижение - это более высокий ранг, чем Конверсия, поэтому (1) однозначно предпочтительнее.
Теперь, во втором примере, мы имеем:
add(char); // (1)
add(double); // (2)
add(int*); // (3)
и призывают с int
. Еще раз, только первые два являются жизнеспособными, и оба связаны с конверсией. (1) на этот раз включает интегральную конверсию (поскольку char
имеет более низкий ранг, чем int
), и (2) по-прежнему включает в себя преобразование с плавающим интегралом, оба из которых имеют одинаковый ранг: преобразование.Поскольку у нас есть две конверсии одного ранга, нет «лучшего» преобразования, поэтому нет лучшего жизнеспособного кандидата. Таким образом, мы имеем двусмысленное решение.
http://en.cppreference.com/w/cpp/language/overload_resolution –
Что вы ожидали? –
@ н.м. я ожидал такой же ошибки для выше кода .... – wrangler