Package pack1 is
Type int_acc_typ is access all integer;
End pack1.
--Local procedure
with pack1;
Procedure main is
Int_acc : pack1.int_acc_type;
Int_var : aliases integer;
Begin
Int_acc := Int_var'access;
End main;
编译器在上述访问分配中抛出错误,表示不能为非本地指针分配本地值。我不明白为什么会出现错误,因为我只是在包中定义了类型,但实际的访问对象仅在本地过程中定义。
我预计不会出现错误,但根据语言,它会出错。
问题是 Access 类型是在“库级别”定义的(基本上可能是最高的生命周期),而变量是在函数内较低/更深的级别声明的。
Ada 禁止将较低/更深级别的对象分配给较高级别的类型,因为该对象将在访问类型超出范围之前很久就被释放。 由于当访问类型离开作用域时(在某些情况下),Ada 可以处理一些自动释放规则,因此该语言禁止将较低作用域的对象分配给较高作用域的访问类型。
在您的具体情况下,不会有任何问题,但编译器需要考虑一般情况。
也就是说,Ada 语言绝对可以使用更细粒度的访问类型规则检修来允许出现这样的情况。 从一般意义上来说,技术上绝对可以做到这一点,只是语言目前不支持它。 您绝对可以在 Ada Rapporteur Group (ARG) github 用户社区输入存储库中提出建议(问题):https://github.com/Ada-Rapporteur-Group/User-Community-Input