当聚合只包含一个元素时,如下所示,位置表示法会导致编译错误,我们只能使用命名表示法。为什么呢?
type singleton is record
v : integer;
end record;
v1 : singleton := (0);
导致编译器消息
check.adb:6:23: positional aggregate cannot have one component
check.adb:6:23: write instead "V => ..."
gnatmake: “check.adb" compilation error
虽然这没关系:
v2 : singleton := (v => 0);
答案 0 :(得分:6)
圆括号表达式的括号是多余的,因此(0)= 0并且它是一个整数而不是数组聚合。
因此,对于单元素聚合的特殊情况,需要使用命名关联来区分聚合和简单值。
将此与(0,0)对比,后者只能是聚合;因此没有歧义。
即使在问题的背景下,对于人类程序员而言,这是显而易见的,并非总是如此。
考虑多维数组中的单元素聚合,它是记录的一个字段;可能存在编译器无法解决的歧义(至少在阅读更多的源文件之前!)并且会让阅读该程序的人生活变得非常困难。
答案 1 :(得分:0)
您不必使用命名表示法。
v1 : singleton := (others => 0);
这将为v1中的所有元素分配0,编译器将知道这不是数字而是数组。
如果记录碰巧有不同类型,您可以使用
v1 : singleton := (others => <>);