【发布时间】:2018-11-19 14:21:01
【问题描述】:
我的程序是:
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 个不同的函数签名,但其背后的逻辑请详细解释。
【问题讨论】:
-
“但我想知道编译器如何处理带有函数重载的默认参数” 好吧,它显然不起作用,因为您遇到了编译错误。如果你打电话给
b.add(10, 20);,它怎么知道你想要这两个函数中的哪一个? -
错误信息是什么?可能它无法在两个有效重载之间做出决定?
-
@SHR - 提出了一个实质性的编辑,修复了所有的语法和拼写,你只是踩到了第一行粗体。 stackoverflow.com/review/suggested-edits/21455932
-
@SHR 请在提交编辑时更加小心。注意你收到的警告。
-
问题是,如果我不使用该默认参数,它可以正常工作,因为 diff 签名我知道编译器如何处理它,但我的问题是编译器在哪个阶段理解它是模棱两可的,因为重载定义只有在调用时才正确显示错误。
标签: c++