如何使通用形式参数别名
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”模式;这将使它像重命名一样,或多或少等同于按引用传递。
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).
并且表达式不能使用别名。
即使你做了S
in out
,你还是无法做到别名
你可以说
generic
S : String;
package My_Package is
T : aliased String := S;
Str : access constant String := T'Access;
end;
我正在尝试像这样声明一个形式参数:
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”模式;这将使它像重命名一样,或多或少等同于按引用传递。
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).
并且表达式不能使用别名。
即使你做了S
in out
,你还是无法做到别名
你可以说
generic
S : String;
package My_Package is
T : aliased String := S;
Str : access constant String := T'Access;
end;