函数重载中的隐式转换序列

时间:2014-09-13 17:40:14

标签: c++ function overloading language-lawyer ambiguous

我不明白编译器如何选择最佳候选人。 例如,让我们有以下代码:

int function(double, int, int){...}
int function(int, double, double){...}

如果第二个函数需要转换两个变量而第一个函数只需要转换一个变量,那么第一个变量怎么没有被选中呢? 为什么这是一个模棱两可的情况?

1 个答案:

答案 0 :(得分:2)

  

为什么这是一个模棱两可的情况?

根据§13.3.3/ 1,

  

鉴于这些定义,可行函数F1被定义为a   如果对于所有参数 i ,ICS i F2),更好函数比另一个可行函数F1 更好转换顺序并不比   ICS i F2,然后

     

- 对于某些参数 j ,ICS j F1)是一个更好的转换   序列比ICS j F2),或者,如果不是,

     

- [...]

因此function(0., 0., 0.)之类的调用含糊不清;这两种重载都不是比另一种更好的匹配。

从函数调用中考虑模板参数推导 - 如果在多个函数参数(如T)中使用模板参数T a, T b, T c,并且对于调用的两个参数,它被推导为{{ 1}},但对于作为int的第三个,是否真的会导致double成功扣除?

超载分辨率不计算更好的匹配并称为赢家 - 这不会是决定性的。

想象一下拼图游戏 - 如果它在两端更好地填充但在另一端更糟糕的情况下,它是否真的更适合差距?