【发布时间】:2015-08-16 22:05:49
【问题描述】:
例如,为什么我不能写这个:
void f(double x, double y = x);
声明一个函数f,其调用f(x)等价于f(x,x)?
如果这对您来说似乎没有用,这里有一个可能的使用场景。在这个例子中,我声明f如下:
void f(double x, double y = expensiveComputation(x));
expensiveComputation 表示,您猜对了,这是一个计算速度非常慢的函数。我想给f 的用户传递y 的值的可能性,如果他以前计算过它,所以我不必在f 内再次计算它。现在,当然我也可以通过编写两个重载来解决这个问题:
void f(double x, double y);
void f(double x) { f(x, expensiveComputation(x)); }
但是随着参数数量的增加,编写重载变得令人厌烦。例如,试着写:
void f(double x, double p = expensiveComputation(x),
double q = expensiveComputation2(x, p),
double r = expensiveComputation3(x, p, q),
double s = expensiveComputation3(x, p, q, r));
使用重载。它只是更丑陋。默认参数是性感的。之前的参数不能用于定义参数默认值是否有更深层次的语法原因?
【问题讨论】:
-
允许这种语法会强制实现从左到右评估参数?
-
@Brian 好点。为什么不强制实现从左到右评估参数?我忘了...
-
在许多平台上,默认调用约定是将参数从最右边开始向左推入堆栈。 (然后被调用者从左到右弹出。)
-
@Brian 但是评估顺序和推送结果的顺序之间没有必然联系?
-
@Quentin 如果参数以不同的顺序进行评估和推送,调用代码会变得更加复杂。
标签: c++ default-arguments