c++默认实参值使用另一个形参的值

C++ default argument value using the value of another parameter

本文关键字:另一个 形参 默认 实参 c++      更新时间:2023-10-16

我知道一个参数的默认参数值不能是另一个参数的值。例如

void foo( int a, int b = a );

显然b的默认值不是编译时常数,但在我看来,编译器可以生成代码来完成此操作。

我肯定有一个很好的理由不允许这样,我想知道它是什么?

这是因为您无法保证参数的求值顺序。

Iso标准第8.3.6节明确规定了原因:

函数参数的求值顺序未指定。因此,函数的参数不能在默认情况下使用参数,即使它们没有被求值。函数的参数在默认参数之前声明的是在作用域中并且可以隐藏的命名空间和类成员名。

但是,如果在某些情况下可以选择函数重载来获得所需的结果:

void foo(int a, int b);
void foo(int a);
void foo(int a, int b) {
    cout << "foo with 2 arguments" << a << "," << b<<endl;
}
void foo(int a) {
    cout << "wrapper foo with 1 argument =>";
    foo(a, a);
}

标准没有强制要求a必须在b之前初始化。因此,它是未定义的行为。