C ++默认函数参数

时间:2012-10-11 19:55:10

标签: c++

我想实现这个目标:

- second parameter by default set to first argument

类似的东西:

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

但是怎么做?

非常感谢!

4 个答案:

答案 0 :(得分:18)

这是禁止的:

8.3.6默认参数[dcl.fct.default]

  

9)每次调用函数时都会计算默认参数。   函数参数的评估顺序未指定。   因此,默认情况下不应使用函数的参数   参数表达式,即使它们未被评估。 a的参数   在默认参数表达式之前声明的函数在范围内   并且可以隐藏命名空间和类成员名称。 [例如:

     

int a;

     

<强> int f(int a , int b = a); / / error: parameter a

     

/ / used as default argument

     

typedef int I;

     

int g( float I , int b = I (2)); / / error: parameter I found

     

int h(int a , int b = sizeof (a )); / / error, parameter a used

     

/ / in default argument

     

-end example]

替代正在超载:

int foo(int a, int b);

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

答案 1 :(得分:3)

这个被禁止的原因已经得到解决,但是@Vyktor的另一个解决方案是使用boost::optional而不是幻数(与创建重载相比,这有利有弊):

int foo(int a, boost::optional<int> b = boost::none)
{
    if(!b) b = a;
}

答案 2 :(得分:2)

我建议将此特定任务的重载用作Luchian Grigore suggested,但通常的做法是保留一些值来说明“这是默认值”。例如

int foo( int a, int b = -1)
{
    if( b == -1){
       b = a;
    }
}

使用对象(不是标量值)这可以很好地实现(通过创建保留的新传递类来表示默认值),但是使用int你必须这样做。

请注意,您必须100%确定b无法获得值-1(或任何保留值)。

答案 3 :(得分:0)

这是一个有趣的答案 - 但有效:

#define TWO_FROM_ONE(a) (a),(a)

f(TWO_FROM_ONE(12));

一个缺点是这将调用一些函数两次(一个已知的宏缺点):

f(TWO_FROM_ONE(sin(123 / PI)));