【问题标题】:C++ overload resolution - ambiguous matchC++ 重载解析 - 模棱两可的匹配
【发布时间】:2020-04-29 00:39:31
【问题描述】:

我正在尝试使用以下测试代码尝试一些基本的重载解析概念:

void foo()
{
   void F(int x, int y);        // F1
   void F(char x, double y);    // F2
   F('A', 5);
}

我已经“尝试”理解 C++17 标准的适用部分,并且还查看了 cppreference.com。我的理解是,F1 的转换序列由提升和精确匹配组成,而 F2 的转换序列由精确匹配和转换组成。 cppreference.com 部分声明

...
F1 is determined to be a better function than F2 if implicit conversions for all 
arguments of F1 are not worse than the implicit conversions for all arguments of 
F2, and
1) there is at least one argument of F1 whose implicit conversion is better than 
the corresponding implicit conversion for that argument of F2
...

基于以上所有,我认为 F1 应该被接受为最佳候选,因为 F1 的最差转换优于 F2 的最差转换。但是,Microsoft 和 minGW 编译器都会生成“模棱两可”的匹配错误。所以很明显我错过了一些东西。我将不胜感激对我所缺少的内容的解释以及对 C++17 中该信息的引用。谢谢!

【问题讨论】:

    标签: c++ overload-resolution ambiguous


    【解决方案1】:

    在确定调用哪个函数时,首先计算所有可行的候选函数。然后根据所需的隐式转换的数量对这些函数中的每一个进行排序。所以给了电话:

    F('a', 5);
    

    需要进行哪些隐式转换?

    F1 // 1st argument: char -> int
       // 2nd argument: int -> int (none)
    
    F2 // 1st argument: int -> int (none)
       // 2nd argument: int -> double 
    

    由于F1F2 都必须分别执行一次隐式转换,因此它们都被认为同样好,并且调用是模棱两可的。特别是,这两种转换具有相同的等级,即它们分别进行整数提升和浮点提升。

    显然有更多规则涵盖更多情况,但在这种情况下,两个函数之间没有平局。

    【讨论】:

    • 感谢您的快速回复。对于 F2,第二个参数转换是 int->double。除此之外,您是说对于具有相同数量参数的函数,其中所有参数都是各种算术类型,最可行的候选者完全基于其隐式转换比其他任何函数都少,而不管排名如何转换序列?
    • 没错,编辑了答案。我相信排名确实很重要,但是在这种情况下,这两个转换具有相同的排名,所以它应该仍然是平局。
    • 除非我误解了 C++17 标准中的表 13,否则 F1 需要积分提升,而 F2 需要浮点积分转换。因此,F1 的转化排名更高。
    • 嗯,我觉得你说得对,看来F2的等级不一样了。
    猜你喜欢
    • 1970-01-01
    • 2019-08-04
    • 2015-01-12
    • 1970-01-01
    • 2012-12-08
    • 2013-11-18
    • 1970-01-01
    • 2016-01-03
    • 2022-08-04
    相关资源
    最近更新 更多