算术促销和转换

将整数类型转换为相应的提升类型比将其转换为其他整数类型更好。

void f(int x);
void f(short x);
signed char c = 42;
f(c); // calls f(int); promotion to int is better than conversion to short
short s = 42;
f(s); // calls f(short); exact match is better than promotion to int

float 提升为 double 比将其转换为其他浮点类型更好。

void f(double x);
void f(long double x);
f(3.14f); // calls f(double); promotion to double is better than conversion to long double

除促销之外的算术转换既不好也不差。

void f(float x);
void f(long double x);
f(3.14); // ambiguous

void g(long x);
void g(long double x);
g(42); // ambiguous
g(3.14); // ambiguous

因此,为了确保在使用任何标准类型的整数或浮点参数调用函数 f 时不会出现歧义,总共需要 8 个重载,因此对于每个可能的参数类型,要么重载匹配确切地或者将选择具有提升的参数类型的唯一重载。

void f(int x);
void f(unsigned int x);
void f(long x);
void f(unsigned long x);
void f(long long x);
void f(unsigned long long x);
void f(double x);
void f(long double x);