在 C++ 中,函数只能定义一次,但是可以多次声明,通常函数的默认实参可以在声明中指定,也可以在定义中指定(我觉得一般应该在声明处定义默认实参,因为在进行函数匹配的时候仅仅需要看到函数的声明),但是对于同一个参数不能在同一个作用域中指定两次,如以下代码,将会报重复定义错误:
int (*func(int a, int b = 10))[10];
int (*func(int a, int b = 20))[10];
clang 输出语法树的报错信息如下:
但是在重复声明的时候,可以指定不同默认参数的值,此时第二次声明是在第一次声明的基础上添加默认参数。如以下代码:
int (*func(int a, int b = 10))[10];
int (*func(int a = 10, int b))[10];
int main()
{
func(1);
return 0;
}
int (*func(int a, int b))[10]
{
int *p = new int[10];
int (*q)[10] = reinterpret_cast<int(*)[10]>(p);
return q;
}
clang 输出语法树如下:
分析以上语法树的输出,可以得出结论,多次声明的时候指定的不同实参相当于对默认实参的添加。