C ++重载解析-模糊匹配

问题描述 投票:0回答:1

我正在尝试使用以下测试代码尝试一些基本的过载解决方案概念:

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个回答
0
投票

[找出要调用的函数时,首先会计算所有可行的候选对象。然后,根据所需的隐式转换的数量对这些函数中的每一个进行排名。所以给定电话:

F('a', 5);

需要执行哪些隐式转换?

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

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

由于F1F2都必须分别执行一次精确的隐式转换,因此它们都被认为具有同等的排名,并且调用不明确。特别是,这两个转换的等级相同,即分别进行积分提升和浮点提升。

显然,有更多的规则涵盖了更多的情况,但是在这种情况下,这两个功能之间没有平局。

© www.soinside.com 2019 - 2024. All rights reserved.