繁体   English   中英

Function 在 c++ 中使用默认参数重载

[英]Function overloading with default parameter in 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;
}

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

或者

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

这是它(过载解决方案)的工作原理:

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

16.3.2.2 首先,要成为可行的 function,候选 function 应具有足够的参数以在数量上与列表中的 arguments 一致。 [...] 只有当 (m+1)-st 参数具有默认参数 (11.3.6) 时,具有超过 m 个参数的候选 function 才可行。 出于重载决议的目的,参数列表在右侧被截断,因此恰好有 m 个参数。

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

您有两个名为add的函数。 一个占用两个 arguments,另一个占用三个 arguments。第二个函数的签名始终是add(int, int, int) 它没有两个签名。

只是如果你自己不给它第三个参数,它就会帮你填上。

当然,这只有在重载解析已经找到add(int, int, int)时才会发生; 正如您所发现的,在这种特殊情况下,编译器不可能猜测您想要add哪个,但如果不是因为歧义,那么它会很简单。 默认参数基本上是语法糖,对 function 的内部、它的签名或它的错位符号名称没有影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM