我知道参数的默认参数值不能是另一个参数的值。例如
void foo( int a, int b = a );
显然b的默认值不是编译时常量,但在我看来,编译器可以生成代码来执行此操作。
我确定有充分理由不允许这样做,我想知道它是什么?
答案 0 :(得分: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);
}
答案 1 :(得分:4)
该标准并未强制要求a
之前必须初始化b
。因此,它是未定义的行为。