函数参数将其他参数作为默认值

时间:2016-07-20 03:18:24

标签: c++ default-arguments

我想要一个函数参数将另一个参数的值作为默认值。

我的问题是:为什么我不被允许这样做?

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

}

还有另一种方法吗?

void foo(int a)
{
   foo(a,a);
}

void foo(int a, int b)
{

}

2 个答案:

答案 0 :(得分:1)

使用

void foo(int a, int b = a) { ... }

是符合标准的错误。

来自C ++ 11标准:

  

8.3.6默认参数

     

每次调用函数时都会计算默认参数。函数参数的评估顺序未指定。因此,函数的参数不得用于默认参数,   即使他们没有被评估。在默认参数之前声明的函数的参数在范围内,并且可以隐藏命名空间和类成员名称。 [例如:

int a;
int f(int a, int b = a); // error: parameter a
                         // used as default argument

...
     

- 结束示例]

答案 1 :(得分:0)

  
      
  1. 为什么我不被允许这样做?
  2.   

由于未指定函数参数的评估顺序,因此无法保证b将使用作为a的参数传入的值进行初始化。

来自$8.3.6/9 Default arguments [dcl.fct.default]

  

每次调用函数时都会计算默认参数   没有相应参数的参数。参数不得   在默认参数中显示为潜在评估的表达式   [例如:

int a;
int f(int a, int b = a);            // error: parameter a
                                    // used as default argument

  
      
  1. 还有其他办法吗?
  2.   

使用函数重载会很简单。