我知道参数的默认参数值不能是另一个参数的值.例如
void foo( int a, int b = a );
Run Code Online (Sandbox Code Playgroud)
显然,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);
}
Run Code Online (Sandbox Code Playgroud)