【问题标题】:implicit conversion sequence in function overloading函数重载中的隐式转换序列
【发布时间】:2014-09-13 17:40:13
【问题描述】:

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

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

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

【问题讨论】:

  • 如果有四个参数,一个比两个更好,一个比另外两个更好,他们进入加时赛然后罚球?更好的匹配必须在每个参数上更好或相等。这不是积分竞赛。

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


【解决方案1】:

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

根据 §13.3.3/1,

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

——对于某些论点 j,ICS j (F1) 是更好的转换 序列比 ICS j (F2),或者,如果不是,

——[...]

因此像function(0., 0., 0.) 这样的调用是模棱两可的;这两个重载都没有比另一个更好的匹配。

考虑从函数调用中推导模板参数 - 如果模板参数 T 用于多个函数参数(如 T a, T b, T c)并且对于调用的两个参数,它被推导出为 int,但对于第三个是double,那真的可以用T=int成功扣分吗?

重载决议不计算更好的比赛并称获胜者 - 这还不够决定性。

想象一个拼图游戏 - 如果它的两端填充得更好但另一端填充得更差,那么它真的更适合填补缺口吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多