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

时间:2014-06-24 18:11:14

标签: c++

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

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

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

我确定有充分理由不允许这样做,我想知道它是什么?

2 个答案:

答案 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。因此,它是未定义的行为。