所以,我写了这样的东西
#include <iostream>
using namespace std;
void f(int32_t i)
{
cout << "int32: " << i << endl;
}
void f(int16_t i)
{
cout << "int16: " << i << endl;
}
void f(int8_t i)
{
cout << "int8: " << i << endl;
}
void f(uint32_t i)
{
cout << "uint32: " << i << endl;
}
void f(uint16_t i)
{
cout << "uint16: " << i << endl;
}
int main() {
uint8_t i = 0u;
f(i);
return 0;
}
它打印出来了
int32: 0
我有点困惑:
在比较不同重载函数所需的转换时,"promotion"被认为是比标准“转换”更好的转换序列。每种算术类型最多可以提升一种其他类型。 (当将参数传递给像printf
这样的C风格的可变参数函数时,也会使用促销。一元+
运算符可用于强制推广算术表达式,如+n
。)
对于非字符类型或bool
的整数类型,提升类型为:
int
可以代表原始类型的所有值,那么int
;unsigned int
可以代表原始类型的所有值,那么unsigned int
;在你的例子中,当比较重载函数时,“完全匹配”将是最好的,但是没有函数正好采用int8_t
(或int8_t&
或const int8_t&
)。促进类型的uint8_t
是int
,因为它需要支持远大于0-255的范围。显然在你的系统上,int32_t
是int
的别名,因此void f(int32_t);
函数只需要对参数进行推广。其他函数都可行,但需要对参数进行整数转换。所以void f(int32_t);
被认为是最好的超载。
因此,问题的技术答案是它是特定于实现的,但仅仅是因为int
和<cstdint>
类型之间的关系,而不是因为重载决策规则。