【发布时间】: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
我想要一个函数参数将另一个参数的值作为默认值。
我的问题是:为什么我不允许这样做?
void foo(int a, int b = a)
{
}
除此之外还有其他方法吗?
void foo(int a)
{
foo(a,a);
}
void foo(int a, int b)
{
}
【问题讨论】:
标签: c++ default-arguments
使用
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 ...——结束示例]
【讨论】:
- 为什么我不允许这样做?
由于未指定函数参数的求值顺序,因此不能保证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
和
- 除此之外还有其他方法吗?
使用函数重载会很简单。
【讨论】: