考虑以下示例程序:
#包括<;iostream>;
typedef枚举{A,B,C}MyEnum;
结构
{
S(int){std::cout<;“int”lt;“std::endl;”
S(MyEnum){std::cout<;“MyEnum”lt;“std::endl;”
};
sf()
{
返回A;
}
int main()
{
S常数S=f();
}
使用clang和gcc编译后,将生成一个可执行文件,该文件将打印;髓鞘;跑步的时候。这个行为是由C++标准保证的吗?
是的,S::S(MyEnum)在重载解析中获胜,因为这是一个精确匹配。而S::S(int)则需要从enum到int再进行一次隐式转换(整数提升)
每种类型的标准转换序列都分配有三个等级中的一个:
- 精确匹配:无需转换,左值到右值转换,限定>;转换,函数指针转换,(自C++17)用户定义的类类型到同一类的转换
- 提升:积分提升、浮点提升
- 转换:积分转换、浮点转换、浮点积分转换、指针转换、指针到成员转换、布尔转换、派生类到其基的用户定义转换
标准转换序列S1优于标准转换序列S2,如果
a) S1是S2的子序列,不包括左值变换。标识转换序列被视为任何其他转换的子序列
b) 或者,如果不是这样,S1的秩比S2的秩好
如果F1的所有参数的隐式转换不比F2的所有参数的隐式转换差,则F1被确定为比F2更好的函数,并且
- 至少有一个F1参数的隐式转换优于该F2参数的相应隐式转换
这些成对比较适用于所有可行函数。如果只有一个可行函数优于所有其他函数,则重载解析成功,并调用此函数。否则,编译将失败