Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

3.10 Типы доступа

Значение типа доступа (значение доступа) обеспечивает косвенный доступ к объекту или подпрограмме, которое оно обозначает. В зависимости от своего типа, значение доступа может обозначать либо подпрограммы, либо объекты, созданные с помощью аллокаторов (см. 4.8), или, более общо, алиасированные объекты соответствующего типа.

Синтаксис

access_type_definition ::=
[null_exclusion] access_to_object_definition
| [null_exclusion] access_to_subprogram_definition
access_to_object_definition ::=
access [general_access_modifier] subtype_indication
general_access_modifier ::= all | constant
access_to_subprogram_definition ::=
access [protected] procedure parameter_profile
| access [protected] function parameter_and_result_profile
null_exclusion ::= not null
access_definition ::=
[null_exclusion] access [constant] subtype_mark
| [null_exclusion] access [protected] procedure parameter_profile
| [null_exclusion] access [protected] function parameter_and_result_profile

Статическая семантика

Существуют два типа доступа: доступ к объекту, значения которого обозначают объекты, и доступ к подпрограмме, значения которого обозначают подпрограммы. Для типа доступа к объекту ассоциирован пул памяти; несколько типов доступа могут использовать один и тот же пул памяти. Все потомки типа доступа используют один и тот же пул памяти. Пул памяти — это область памяти, используемая для хранения динамически выделенных объектов (называемых элементами пула), созданных аллокаторами; пулы памяти подробно описаны в 13.11, «Управление памятью».
Типы доступа к объекту далее подразделяются на специфичные для пула типы доступа, значения которых могут обозначать только элементы их ассоциированного пула памяти, и общие типы доступа, значения которых могут обозначать элементы любого пула памяти, а также алиасированные объекты, созданные с помощью объявлений, а не аллокаторов, и алиасированные подкомпоненты других объектов.
Вид объекта определяется как алиасированный, если он определен с помощью object_declaration, component_definition, parameter_specification или extended_return_object_declaration с зарезервированным словом aliased, или путем переименования алиасированного вида. Кроме того, обращение к значению доступа к объекту обозначает алиасированный вид, как и преобразование вида (см. 4.6) алиасированного вида. qualified_expression обозначает алиасированный вид, когда операнд обозначает алиасированный вид. Текущий экземпляр неизменяемого ограниченного типа (см. 7.5) определяется как алиасированный. Наконец, формальный параметр или формальный объект-параметр обобщенного типа с меткой определяется как алиасированный. Алиасированные виды — это те, которые могут быть обозначены значением доступа.
Определение access_to_object_definition определяет тип доступа к объекту и его первый подтип; subtype_indication определяет обозначаемый подтип типа доступа. Если появляется general_access_modifier, то тип доступа является общим типом доступа. Если модификатор — зарезервированное слово constant, то тип — это тип доступа к константе; обозначенный объект не может быть обновлен через значение такого типа. Если модификатор — зарезервированное слово all, то тип — это тип доступа к переменной; обозначенный объект может быть как прочитан, так и обновлен через значение такого типа. Если в access_to_object_definition не указан general_access_modifier, тип доступа является специфичным для пула типом доступа к переменной.
Определение access_to_subprogram_definition определяет тип доступа к подпрограмме и его первый подтип; parameter_profile или parameter_and_result_profile определяют обозначаемый профиль типа доступа. С обозначенным профилем связана конвенция вызова; только подпрограммы с этой конвенцией вызова могут быть обозначены значениями типа доступа. По умолчанию конвенция вызова — «protected», если указано зарезервированное слово protected, и «Ada» в противном случае. См. Приложение B для информации о переопределении этого значения по умолчанию.
access_definition определяет анонимный общий тип доступа или анонимный тип доступа к подпрограмме. Для общего типа доступа subtype_mark обозначает его обозначаемый подтип; если появляется general_access_modifier constant, то тип является типом доступа к константе; в противном случае он является типом доступа к переменной. Для типа доступа к подпрограмме parameter_profile или parameter_and_result_profile обозначает его обозначаемый профиль.
Для каждого типа доступа существует нулевое значение доступа, которое не обозначает ни одного сущности, которое можно получить, (неявно) преобразуя литерал null к типу доступа. Нулевое значение типа доступа является значением по умолчанию для типа. Не нулевые значения типа доступа к объекту получаются путем вычисления allocator, который возвращает значение доступа, обозначающее вновь созданный объект (см. 3.10.2), или в случае общего типа доступа к объекту, вычисляя attribute_reference для атрибута Access или Unchecked_Access алиасированного вида объекта. Не нулевые значения типа доступа к подпрограмме получаются путем вычисления attribute_reference для атрибута Access не встроенной подпрограммы.
null_exclusion в конструкции указывает, что нулевое значение не принадлежит подтипу доступа, определенному конструкцией, то есть подтип доступа исключает нуль. Кроме того, анонимный подтип доступа, определенный access_definition для управляющего параметра доступа (см. 3.9.2) исключает нуль. Наконец, для subtype_indication без null_exclusion, подтип, обозначаемый subtype_indication, исключает нуль, если и только если подтип, обозначаемый subtype_mark в subtype_indication, исключает нуль.
Все подтипы типа доступа к подпрограмме ограничены. Первый подтип типа, определенного access_definition или access_to_object_definition, является неограниченным, если обозначаемый подтип — неограниченный массив или подтип с дискриминаторами; в противном случае он ограничен.

Правила легальности

Если subtype_indication, discriminant_specification, parameter_specification, parameter_and_result_profile, object_renaming_declaration или formal_object_declaration имеет null_exclusion, то subtype_mark в этой конструкции должен обозначать подтип доступа, который не исключает нуль.

Динамическая семантика

A composite_constraint is compatible with an unconstrained access subtype if it is compatible with the designated subtype. A null_exclusion is compatible with any access subtype that does not exclude null. An access value satisfies a composite_constraint of an access subtype if it equals the null value of its type or if it designates an object whose value satisfies the constraint. An access value satisfies an exclusion of the null value if it does not equal the null value of its type.
The elaboration of an access_type_definition creates the access type and its first subtype. For an access-to-object type, this elaboration includes the elaboration of the subtype_indication, which creates the designated subtype.
The elaboration of an access_definition creates an anonymous access type.
NOTE 1 Access values are called “pointers” or “references” in some other languages.
NOTE 2 Each access-to-object type has an associated storage pool; several access types can share the same pool. An object can be created in the storage pool of an access type by an allocator (see 4.8) for the access type. A storage pool (roughly) corresponds to what some other languages call a “heap”. See 13.11 for a discussion of pools.
NOTE 3 Only index_constraints and discriminant_constraints can be applied to access types (see 3.6.1 and 3.7.1).

Примеры

Примеры типов доступа к объектам:
type Frame is access Matrix; -- см. 3.6
type Peripheral_Ref is not null access Peripheral; -- см. 3.8.1
type Binop_Ptr is access all Binary_Operation'Class;
-- общий доступ к классу, см. 3.9.1
Пример подтипа доступа:
subtype Drum_Ref is Peripheral_Ref(Drum); -- см. 3.8.1
Пример типа доступа к подпрограмме:
type Message_Procedure is access procedure (M : in String := "Error!");
procedure Default_Message_Procedure(M : in String);
Give_Message : Message_Procedure := Default_Message_Procedure'Access;
...
procedure Other_Procedure(M : in String);
...
Give_Message := Other_Procedure'Access;
...
Give_Message("File not found.");
-- вызов с параметром (.all необязателен)
Give_Message.all; -- вызов без параметров


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API