Ada 中的默认参数在哪里评估?

Where are Default Parameters evaluated in Ada?

所以我们知道 Ada 支持这样的默认参数

procedure Example(param1 : Integer := 1);

但我的问题是,默认参数在哪里求值?在我熟悉的所有语言中,默认参数只是插入到调用代码中,如果更改默认参数,则需要下游重新编译。 Ada 是否使用相同的方法?

我尝试搜索 ARM 2012,但在整个文档的任何地方都找不到 "default parameter"。然后我检查了 6.4 和 6.4.1,似乎 ARM 调用了相关部分 "default expressions"。但是 "default expressions" 链接到 3.7 判别式。这可能会被用来减少定义某些东西的次数,但是如果这对两个概念是共同的,他们应该做程序员所做的事情并分别定义它;这个跳跃令人困惑,似乎是一个错误。

注释 59 读取:

The default_expression for a discriminant of a type is evaluated when an object of an unconstrained subtype of the type is created.

嗯,这对于子例程调用没有任何意义。

那么, 子程序 的 "default expression" 什么时候实际计算?

我在发布这个问题后不久就找到了。

6.4.1 6.25/3 读作:

For a call, any default_expression evaluated as part of the call is considered part of the call.

您找对地方了,但您肯定错过了 RM 6.4 10/2 中的重要部分:

10/2 For the execution of a subprogram call, the name or prefix of the call is evaluated, and each parameter_association is evaluated (see 6.4.1). If a default_expression is used, an implicit parameter_association is assumed for this rule. These evaluations are done in an arbitrary order.