为什么单元素记录聚合需要命名关联?

leu*_*age 1 record ada

当聚合只包含一个元素时,如下所示,位置表示法会导致编译错误,我们只能使用命名表示法.为什么?

type singleton is record
   v : integer;
end record;

v1 : singleton := (0);
Run Code Online (Sandbox Code Playgroud)

导致编译器消息

check.adb:6:23: positional aggregate cannot have one component
check.adb:6:23: write instead "V => ..."
gnatmake: “check.adb" compilation error
Run Code Online (Sandbox Code Playgroud)

这没关系:

v2 : singleton := (v => 0);
Run Code Online (Sandbox Code Playgroud)

Bri*_*ond 6

圆表达式的圆括号是多余的,因此(0)= 0并且它是整数而不是数组聚合.

因此,对于单元素聚合的特殊情况,需要使用命名关联来区分聚合和简单值.

将此与(0,0)对比,后者只能是聚合; 因此没有歧义.

即使在问题的背景下,对于人类程序员而言,这是显而易见的,并非总是如此.

考虑多维数组中的单元素聚合,它是记录的一个字段; 可能存在编译器无法解决的歧义(至少,在阅读更多的源文件之前!)并且会让阅读该程序的人生活变得非常困难.