Ete*_*nal 17 c++ overloading implicit-conversion c++11
所以,我写了这样的东西
#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;
}
Run Code Online (Sandbox Code Playgroud)
它打印出来了
int32: 0
Run Code Online (Sandbox Code Playgroud)
我有点困惑:
这是明确定义的行为,还是特定于实现?
确定此处使用哪个重载以及变量转换的类型的规则是什么?
asc*_*ler 22
在比较不同重载函数所需的转换时,"促销"被认为是比标准"转换"更好的转换序列.每种算术类型最多可以提升一种其他类型.(将参数传递给C风格的可变参数函数时也会使用促销printf.一元运算+符可用于强制提升算术表达式,例如+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>不是因为重载决策规则.