Этот пример сводится к разнице между целочисленным продвижением и целочисленным преобразованием. Короче говоря, продвижение по службе:
Prvalue целочисленного типа, отличного от bool, char16_t, char32_t или wchar_t, чей ранг целочисленного преобразования (4.13) меньше, чем ранг int, может быть преобразовано в prvalue типа int, если int может представлять все значения исходного типа ; в противном случае исходное prvalue может быть преобразовано в prvalue типа unsigned int. [...] Эти преобразования называются интегральными акциями.
тогда как целочисленное преобразование является более общим:
Prvalue целочисленного типа может быть преобразовано в prvalue другого целочисленного типа. [...] Преобразования, разрешенные как целые продвижения, исключаются из набора целых преобразований.
Целостное продвижение - это лучшее преобразование, чем интегральное преобразование с точки зрения разрешения перегрузки.
В первом примере у нас есть:
add(int ); // (1)
add(double ); // (2)
add(int* ); // (3)
и звонят с char
. Только первые два жизнеспособны, оба предполагают преобразование. (1) включает целочисленное продвижение, которое имеет ранговое продвижение. (2) включает преобразование с плавающей точкой в интеграл, которое имеет преобразование рангов. Поощрение имеет более высокий рейтинг, чем Конверсия, поэтому (1) однозначно предпочтительнее.
Теперь во втором примере у нас есть:
add(char ); // (1)
add(double ); // (2)
add(int* ); // (3)
и звонят с int
. Опять же, жизнеспособны только первые два, и оба предполагают преобразование. (1) на этот раз включает интегральное преобразование (поскольку char
имеет более низкий ранг, чем int
) и (2) по-прежнему включает преобразование с плавающей запятой, оба из которых имеют одинаковый ранг: преобразование. Поскольку у нас есть две конверсии одного ранга, не существует «лучшей» конверсии, поэтому нет лучшего жизнеспособного кандидата. Таким образом, мы имеем неоднозначное разрешение.
person
Barry
schedule
03.11.2015