2016-07-20 182 views
1

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

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

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

} 

并且还有其他方法可以做到吗?

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

void foo(int a, int b) 
{ 

} 
+0

此链接将帮助您http://stackoverflow.com/questions/4989483/where-to-put-default-parameter-value-in-c –

回答

0
  1. 为什么我不能这样做呢?

因为函数参数的计算顺序是不确定的,它不能保证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

    使用

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

    是错误按照标准。

    从C++ 11标准:

    8.3.6默认参数

    9默认参数每个函数被调用时被评估。函数参数的评估顺序未指定。因此,函数的参数不应用于默认参数 ,即使它们未被评估。在默认参数之前声明的函数的参数在作用域中,并且可以隐藏名称空间和类成员名称。 [示例:

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

    - 结束举例]