c++ - 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 个不同的函数签名,但其背后的逻辑请详细解释。
解决方案
以下是它(重载分辨率)的工作原理:
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 个参数。
所以基本上,它们在重载解析期间具有相同的签名。
推荐阅读
- c++ - fltk 在代码块中找不到 -lXcursor
- paypal - 每月和每年周期的 PayPal 订阅
- python - 使用 DataFrame 列作为索引并将重复项附加为新列
- mysql - 连接到另一个变量的唯一数据库列
- json - 如何在swift中将两个值中的一个值添加到参数键?
- mongodb - 使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序
- java - 如何使用在某一天结束并在另一天重新开始计数的计数器(倒计时)?
- node.js - 带有确认的 Socketclustser 不起作用
- java - Java Regex - 定义捕获组时可能出现错误
- ruby-on-rails - ruby on rails 的 React/redux 优势