我正在尝试了解重载解决方法。

为什么这样模棱两可:

void func(double, int, int, double) {}
void func(int, double, double, double) {}

void main()
{
    func(1, 2, 3, 4);
}

但这不是吗?
void func(int, int, int, double) {}
void func(int, double, double, double) {}

void main()
{
    func(1, 2, 3, 4);
}

在第一种情况下,有2个精确参数匹配和2个转换(针对1个精确匹配和3个转换),在第二种情况下,有3个精确匹配和1个转换针对1个精确匹配和3个转换。

那么,为什么一个模棱两可,而一个模棱两可呢?这里的逻辑是什么?

最佳答案

重载解析规则仅在所有匹配项的集合上定义部分顺序-如果重载F1F2更好,则并不意味着F2F1更好。可以将确切的偏序视为在k维度中比较两个点,其中参数数量为k。让我们在k -dim space-(x_1, x_2,..., x_k) < (y_1, y_2,..., y_k) if x_i <= y_i for all i and x_j < y_j for at least one j中的点上定义此偏序。这恰好是该标准定义的候选非模板函数的部分顺序。

让我们看看您的示例:

void func(double, int,    int,    double) {}
                  vvv     vvv       vvv
                 better  better    equal
void func(int,    double, double, double) {}
          vvv                       vvv
         better                    equal

因此,两个过载都不比另一个过载好。

在第二个示例中:
void func(int,   int,   int,   double) {}
          vvv    vvv    vvv     vvv
         equal  better better  equal
void func(int, double, double, double) {}
          vvv
         equal

现在,除了一个参数外,第一个重载比第二个重载更好,并且永远不会比第二个重载。因此,没有歧义-偏序确实确实更好地声明了第一个。

(以上描述未考虑功能模板。您可以在cppreference上找到更多详细信息。)

关于c++ - 如何在过载解析算法中确定歧义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29090692/

10-09 13:11