C++默认参数值使用另一个参数的值

gon*_*ing 1 c++

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

void foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*phe 5

这是因为您无法保证参数的评估顺序.

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);
}
Run Code Online (Sandbox Code Playgroud)