首页 > 解决方案 > c++中带默认参数的函数重载

问题描述

我的程序是:

class base {
    int a, b;
public:
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c=0 ){
        return a + b + c;
    }
};

int main() {

    base b;
    b.add(10, 20);//compilation error
    return 0;
}

我知道有歧义出现。但我想知道编译器如何处理具有函数重载的默认参数。因为如果我不调用这个函数或调用 add(10,20,0) 它工作正常。

或者

对于函数重载,它被视为 add(int,int),add(int ,int, int),因为它有 2 个不同的函数签名,但其背后的逻辑请详细解释。

标签: c++

解决方案


以下是它(重载分辨率)的工作原理:

16.3.2.1 从为给定上下文(16.3.1)构建的候选函数集合中,选择一组可行函数,通过比较参数转换序列和相关约束(17.4.2)从中选择最佳函数最合适的(16.3.3)。

16.3.2.2 首先,作为一个可行的函数,一个候选函数应该有足够的参数在数量上与列表中的参数一致。[...] 仅当 (m+1)-st 参数具有默认参数 (11.3.6) 时,具有多于 m 个参数的候选函数才是可行的。出于重载决议的目的,参数列表在右侧被截断,因此正好有 m 个参数。

所以基本上,它们在重载解析期间具有相同的签名。


推荐阅读