Все, что идет от 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
также является повышением (однако в любом случае не имеет перегрузки).