8

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

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

对于以下代码:

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

第二个boo应该是首选,因为它最弱的匹配是提升,而第一个是标准类型转换。

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

错误:ISO C++ 说这些是模棱两可的,即使第一个的最差转换优于第二个的最差转换。

有任何想法吗?

4

2 回答 2

12

您对重载解决方案的理解是错误的。一般规则(当有多个参数时)是选择一个函数,该函数至少有一个参数更好(不管好多少),其他参数都不差。换句话说,编译器分别处理每个参数,为其创建一组“最佳匹配”。在此之后,它需要这些集合的并集:如果交集正好包含一个函数,那么你就赢了。否则,它是模棱两可的。

于 2013-08-09T17:32:52.337 回答
0

假设您调用了函数 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);
}
于 2013-08-11T09:21:58.817 回答