2016-08-12 59 views
9

有人可以解释为什么重载解析会选择第二个函数,而不是报告一个模糊的错误。无论如何,第二个函数是完全匹配的,但第一个函数需要进行资格转换(从char *到const char *)。然而,来自http://en.cppreference.com/w/cpp/language/overload_resolution
的文件指出,资格转换也是精确匹配,因此两个候选人应具有相同的排名。C++函数重载与精确匹配

每种类型的标准转换序列的分配的三个等级之一:

1)完全匹配:无需转换,左值到右值转换,资格转换,函数指针转换,(因为C + 17)用户定义的类型的转换到同一类

2)促进:积分推广,浮点促进

3)转化率:积分转换,浮点转换,浮积分转换,指针转换,pointer-to-memb呃转换,布尔转换,派生类的用户定义转换到它的基地

void g(const char* x) 
{ 
    std::cout << "g(const char* x)" << std::endl; 
} 

void g(char* x) 
{ 
    std::cout << "g(char* x)" << std::endl; 
} 

void callg() 
{ 
    char a[] = "sample"; 
    g(a); 
} 

回答

8

两个函数都需要一个阵列到指针的转换,但所述第一需要额外的资格转换。

你在说都是一个精确匹配是正确的

[over.ics.scs/3

[...]转换序列的等级是考虑确定序列中每次转换的等级和任何参考结合的等级(13.3.3.1.4)。如果其中任何一个有转换等级,则该序列具有转换等级;否则,如果其中任何一个具有促销等级,则该序列具有促销等级;否则,该序列具有完全匹配等级。

但根据在[over.ics.rank]/3.2

标准转换序列的规则S1S2如果

[标准转换序列的更好的转换序列... ]

(3.2.5) - S1S2只有不同的资格转换和产量类似的类型T1T2(4.4),并且T1类型的cv资格签名是T2类型的cv资格签名的适当子集。

同样的规则是你

3)标准转换序列S1比标准转换序列更好“隐式转换序列本位”下的链接页面上S2如果

[...]

F)或者,如果不是,S1S2仅在资格转换不同,和S1结果的CV-资质的S2

+0

我无法理解“你说的两个都是完全匹配是正确的”如何? –

+0

@GilsonPJ所需转换(数组到指针和限定)的级别是精确匹配,因此整个转换序列也是精确匹配。 – user657267

+0

@Gilson:基本上都是完全匹配,并且具有相同的排名......但是关于cv-qualification的特殊规则胜过了这一点,并给出了#2优先级。简而言之:**它只是**。 –

0
结果的CV-资格的一个子集

在重载分辨率中,T *和const T *被视为不同的参数类型。 [over.load] 13.1 /(3.4):

特别地,对于任何类型的T, “指针T”, “指针为const T”,和 “指针到易失性T” 被认为是不同的参数类型,如“对T的引用”,“对const T的引用”和“对易失性T的引用”。