如何使通用形式参数别名

How to make generic formal parameter aliased

我正在尝试像这样声明一个形式参数:

generic
   S : aliased String;
package My_Package is
   Str : access constant String := S'Access;
end;

但是这段代码无法编译。为什么我不能让 S 别名?

简单的答案是:因为 Ada 标准不允许这样做。至于为什么不允许,我不知道;我不知道有任何关于此问题的讨论。

你为什么要这样做?

你的示例代码在另一个方面当然也是不正确的:Str 的初始化应该提供一个访问值,而不是像 S 这样的字符串值。但是你不能使用 S'Access,因为 S 没有别名。

使用 GNAT,您可以使用 S'Unrestricted_Access,即使正式对象没有别名。如果你这样做,你应该对正式对象使用“in out”模式;这将使它像重命名一样,或多或少等同于按引用传递。

ARM 12.4 (7)

For a generic formal object of mode in, the actual shall be an expression. For a generic formal object of mode in out, the actual shall be a name that denotes a variable for which renaming is allowed (see 8.5.1).

并且表达式不能使用别名。

即使你做了Sin out,你还是无法做到别名

你可以说

generic
   S : String;
package My_Package is
   T : aliased String := S;
   Str : access constant String := T'Access;
end;