重载函数和有默认值函数的关系

今天看到ppt上有这样一句话:一个函数不能既作为重载参数,又作为有默认参数的函数。
重载函数和有默认值函数的关系
于是就试验了一下,发现这句话在某些情况下是成立的,但是在某些情况下不成立。
例如下图,可以成功运行
重载函数和有默认值函数的关系
但是一旦引发了歧义,比如把第一个函数的形参a改成int类型,就会报错,因为编译器不知道到底应该调用哪一个函数了。这种情况下,红字是正确的
重载函数和有默认值函数的关系
PS:在实验过程中,发现了一个有趣的现象
如果有一个未重构函数,在调用时实参和形参不匹配,有时会发生强制类型转换。但是如果有一个函数经过了重构,在调用时如果形参和实参不匹配,大概率会报错,可能是因为编译器认为这种情况是你忘记重构这种情况了。

比如我们把第5行的double改成float,就会报错,因为无法找到第一个参数是float的同名函数
重载函数和有默认值函数的关系
但是如果把第5行float改回为double,但是调用时传入20.0f,那么就不会报错
重载函数和有默认值函数的关系
初步认为是因为,如果实参需要增加精度变成形参,就不会报错,如果实参需要降低精度变为形参,那么就会报错。这也是为什么我在上文说,大概率报错。