有人可以解释为什么重载解析会选择第二个函数,而不是报告一个模糊的错误。无论如何,第二个函数是完全匹配的,但第一个函数需要进行资格转换(从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);
}
我无法理解“你说的两个都是完全匹配是正确的”如何? –
@GilsonPJ所需转换(数组到指针和限定)的级别是精确匹配,因此整个转换序列也是精确匹配。 – user657267
@Gilson:基本上都是完全匹配,并且具有相同的排名......但是关于cv-qualification的特殊规则胜过了这一点,并给出了#2优先级。简而言之:**它只是**。 –