过载分辨率

Overloading resolution

本文关键字:分辨率      更新时间:2023-10-16

据我所知,当在两个候选函数之间进行选择时,编译器会更喜欢匹配最弱的函数。例如,如果我有:

void boo(int i, char c);  
void boo(double d, int i);

对于以下代码:

float f = 1.0;  
char c = 'c';
boo(f,c);

第二个CCD_ 1应该是优选的,因为它的最弱匹配是升级,而第一个是标准类型转换。

但当我尝试编译它(使用gcc)时,我得到了:

错误:ISO C++说这些是不明确的,尽管第一个的最差转换比第二个的最坏转换要好。

有什么想法吗?

您对过载解决方案的理解是错误的。将军规则(当有多个参数时)是选择至少有一个参数更好的函数不管好多少),其他人都不差。在里面换句话说,编译器分别处理每个自变量,为它创建一组"最佳匹配"。之后这些集合的并集:如果交集恰好包含一个函数,你赢了。否则,它是模棱两可的。

假设您调用了函数f。我认为过载解决过程是:1.创建一组候选函数。这组函数包括所有名为f的函数,这些函数可以从调用f()的位置访问。2.创建一组可行的函数。这组函数是候选函数的子集,每个可行函数的参数数量与用于调用f()的参数数量一致。3.选择最佳可行函数最佳可行函数是指其参数都具有比所有其他可行函数更好或相等的隐式转换序列的函数。如果多于或少于一个(不完全是一个),则会出现编译错误。下面的例子很好地展示了它:

class cat
{
public:
    cat(int);
};
void func(int, int, int, cat)
{
    std::cout << 1 << std::endl;
}
void func(int, int, double, double)
{
    std::cout << 2 << std::endl;
}
int main()
{
    func(1,2,3,4);
}

此代码生成编译错误(VS)或警告(g++)。

以下将正确运行(打印1):

void func(int, int, int, double)
{
        std::cout << 1 << std::endl;
}
void func(int, double, double, double)
{
        std::cout << 2 << std::endl;
}
int main()
{
        func(1,2,3,4);
}