Руководство по Ada (Ada 2022)
12.4 Формальные объекты
Формальный объект в генерическом контексте может использоваться для передачи значения или переменной в генерическую единицу.
Синтаксис
formal_object_declaration ::=
defining_identifier_list : mode [null_exclusion] subtype_mark [:= default_expression]
[aspect_specification];
| defining_identifier_list : mode access_definition [:= default_expression]
[aspect_specification];
defining_identifier_list : mode [null_exclusion] subtype_mark [:= default_expression]
[aspect_specification];
| defining_identifier_list : mode access_definition [:= default_expression]
[aspect_specification];
Правила разрешения имен
Ожидаемый тип для default_expression, если таковой имеется, для формального объекта — это тип формального объекта.
Для формального объекта в генерическом контексте с режимом in ожидаемый тип для фактического параметра — это тип формального объекта.
Для формального объекта в режиме in out тип фактического параметра должен соответствовать типу, определяемому subtype_mark, или для formal_object_declaration с access_definition — специфическому анонимному типу доступа. Если анонимный тип доступа — это тип доступа к объекту, тип фактического параметра должен иметь тот же тип объекта, что и access_definition. Если анонимный тип доступа — это тип доступа к подпрограмме, тип фактического параметра должен иметь профиль, который соответствует профилю access_definition.
Правила легитимности
Если формальный объект имеет default_expression, то режим должен быть in (явный или по умолчанию); в противном случае режим должен быть in или in out.
Для формального объекта в режиме in фактический параметр должен быть выражением. Для формального объекта в режиме in out фактический параметр должен быть именем переменной, для которой разрешено переименование (см. 8.5.1).
В случае, когда тип формального объекта определяется access_definition, тип фактического и формального объекта:
- должны оба быть типами доступа к объектам с статически соответствующими обозначенными подтипами, и оба должны или не должны быть типами доступа к константам; или
- должны оба быть типами доступа к подпрограммам с подтипосообразными обозначенными профилями.
Для formal_object_declaration режима in out с null_exclusion или access_definition, имеющей null_exclusion, подтип фактического параметра, соответствующий formal_object_declaration, должен исключать null. Кроме того, если фактический параметр, соответствующий formal_object_declaration, статически обозначает формальный объект в режиме in out другой генерической единицы G, и инстанцирование, содержащее фактический параметр, происходит внутри тела G или внутри тела генерической единицы, объявленной в области объявления G, то объявление формального объекта G должно иметь null_exclusion. В дополнение к местам, где обычно применяются Правила легитимности (см. 12.3), это правило применяется также в приватной части экземпляра генерической единицы.
Статическая семантика
formal_object_declaration объявляет формальный объект в генерическом контексте. Режим по умолчанию — in. Для формального объекта режима in номинальный подтип — тот, который обозначается subtype_mark или access_definition в объявлении формального объекта. Для формального объекта режима in out его тип определяется subtype_mark или access_definition; его номинальный подтип нестатистический, даже если subtype_mark обозначает статический подтип; для составного типа его номинальный подтип не ограничен, если первый подтип типа не ограничен, даже если subtype_mark обозначает ограниченный подтип.
В экземпляре formal_object_declaration режима in — это полное объявление константы и объявляет новый автономный константный объект, чьё выражение инициализации — фактический параметр, а formal_object_declaration режима in out объявляет представление, чьи свойства идентичны свойствам фактического параметра.
Динамическая семантика
Для вычисления generic_association для формального объекта режима in создаётся константный объект, значение фактического параметра преобразуется в номинальный подтип формального объекта и присваивается объекту, включая любые корректировки значений — см. 7.6.
ПРИМЕЧАНИЕ Ограничения, которые применяются к формальному объекту в генерическом контексте режима in out, — это ограничения соответствующего фактического параметра (а не те, что подразумеваются subtype_mark, который появляется в formal_object_declaration). Поэтому, чтобы избежать путаницы, рекомендуется использовать имя первого подтипа для объявления такого формального объекта.