[英]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.