【问题标题】:Function overloading with default parameter in c++c++中带默认参数的函数重载
【发布时间】: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++


【解决方案1】:

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

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 个参数。

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

【讨论】:

    【解决方案2】:

    您有两个名为add 的函数。一个接受两个参数,另一个接受三个参数。第二个函数的签名总是add(int, int, int)。它没有两个签名。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多