将其他参数作为默认值的函数参数

Function argument taking other argument as default value

本文关键字:参数 函数 默认值 其他      更新时间:2023-10-16

我希望函数参数将其他参数的值作为默认值。

我的问题是:为什么不允许我那样做?

void foo(int a, int b = a)
{
}

还有别的办法吗?

void foo(int a)
{
   foo(a,a);
}
void foo(int a, int b)
{
}

使用

void foo(int a, int b = a) { ... }

根据标准,是一个错误。

来自C++11标准:

8.3.6默认参数

9每次调用函数时都会评估默认参数。函数参数的求值顺序未指定。因此,函数的参数不应用于默认参数中,即使它们没有被评估。在默认参数之前声明的函数的参数在作用域中,并且可以隐藏命名空间和类成员名称[示例:

int a;
int f(int a, int b = a); // error: parameter a
                         // used as default argument
...

-结束示例]

  1. 为什么不允许我那样做

由于函数参数的求值顺序未指定,因此不能保证b将使用作为a的参数传入的值进行初始化。

从$8.3.6/9默认参数[dcl.fct.default]:

每次使用调用函数时,都会计算默认参数没有对应参数的参数。参数不应在默认参数中显示为可能求值的表达式
[示例:

int a;
int f(int a, int b = a);            // error: parameter a
                                    // used as default argument

  1. 还有别的办法吗

使用函数重载非常简单。