【问题标题】:c++ function overloading with Exact Match使用精确匹配的 c++ 函数重载
【发布时间】:2016-12-20 00:03:25
【问题描述】:

谁能解释为什么重载解决方案会选择第二个函数,而不是报告一个模棱两可的错误。无论如何,第 2 个函数是完全匹配的,但第 1 个函数进行了限定转换(从 char*​ 到 const char*)。但是,来自http://en.cppreference.com/w/cpp/language/overload_resolution的文档
说明资格转换也是完全匹配的,因此两个候选人应该具有相同的排名。

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

1) 精确匹配:无需转换、左值到右值转换、限定转换、函数指针转换、(C++17 起)用户定义的类类型到同一类的转换

2) 提升:积分提升、浮点提升

3) 转换:整数转换、浮点转换、浮点整数转换、指针转换、指针到成员的转换、布尔转换、派生类到其基类的用户定义转换

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);
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    这两个函数都需要数组到指针的转换,但第一个函数需要额外的限定转换。

    你说得对,两者都是完全匹配

    [over.ics.scs] / 3

    [...] 转换序列的排名是通过考虑序列中每个转换的排名和任何参考绑定 (13.3.3.1.4) 的排名来确定的。如果其中任何一个具有转换等级,则序列具有转换等级;否则,如果其中任何一个具有晋升等级,则该序列具有晋升等级;否则,该序列具有精确匹配等级。

    但根据 [over.ics.rank] / 3.2 中的规则

    标准转换序列S1是比标准转换序列S2更好的转换序列如果

    [...]

    (3.2.5) - S1S2 的区别仅在于它们的限定转换并分别产生相似的类型 T1T2 (4.4),以及类型为 T1 的 cv 限定签名是 T2 类型的 cv 限定签名的真子集。

    您在“隐式转换序列的排名”下链接的页面上也有相同的规则

    3) 如果

    ,标准转换序列S1 比标准转换序列S2更好

    [...]

    f) 或者,如果不是这样,S1S2 仅在资格转换上不同,S1 结果的 cv-qualification 是 @987654334 结果的 cv-qualification 的子集@

    【讨论】:

    • 我无法理解“你说得对,两者都是完全匹配”如何?
    • @GilsonPJ 所需转换的排名(数组到指针和限定)是精确匹配,因此整体转换序列也是精确匹配。
    • @Gilson:基本上,两者都是精确匹配并且具有相同的等级......但是关于 cv-qualification 的特殊规则胜过这一点并给予#2优先级。简而言之:它就是
    【解决方案2】:

    在重载决议中,T* 和 const T* 被认为是不同的参数类型。 [过载] 13.1/(3.4):

    特别是,对于任何类型 T,“指向 T”、“指向 const T 的指针”和“指向 volatile T 的指针”被视为不同的参数类型,“对 T 的引用”、“对 const T 的引用”也是如此”,以及“对 volatile T 的引用”。

    【讨论】:

      猜你喜欢
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2020-10-29
      相关资源
      最近更新 更多