【问题标题】:Function argument taking other argument as default value [duplicate]将其他参数作为默认值的函数参数[重复]
【发布时间】:2016-07-20 03:18:24
【问题描述】:

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

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

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

}

除此之外还有其他方法吗?

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

void foo(int a, int b)
{

}

【问题讨论】:

标签: c++ default-arguments


【解决方案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

...

——结束示例]

【讨论】:

    【解决方案2】:
    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. 除此之外还有其他方法吗?

    使用函数重载会很简单。

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2015-04-21
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2010-10-03
      相关资源
      最近更新 更多