Руководство по Ada (Ada 2022)
6.2 Режимы формальных параметров
A parameter_specification объявляет формальный параметр с режимом in, in out или out.
Статическая семантика
Параметр передаётся либо по значению, либо по ссылке. При передаче по значению формальный параметр обозначает отдельный объект от фактического параметра, и любое передача информации между ними происходит только до и после выполнения подпрограммы. При передаче по ссылке формальный параметр обозначает (вид) объекта, обозначаемого фактическим параметром; чтение и обновление формального параметра напрямую ссылаются на объект фактического параметра.
Тип является типом копирования, если он является элементарным типом или является потомком приватного типа, полным типом которого является тип копирования. Параметр типа копирования передаётся по значению, если формальный параметр явно не является псевдонимом.
Тип является типом ссылки, если он является потомком одного из следующих типов:
- меченый тип;
- задача или защищённый тип;
- явный ограниченный тип записи;
- составной тип с подкомпонентом типа ссылки;
- приватный тип, полным типом которого является тип ссылки.
Параметр типа ссылки передаётся по ссылке, как и явно псевдонимизированный параметр любого типа. Каждый параметр типа ссылки имеет связанный объект. Для преобразования значений связанный объект — это анонимный результирующий объект, если такой объект создаётся (см. 4.6); в противном случае это связанный объект операнда. В других случаях объект, связанный с оцениваемым операционным составляющим имени или выражения (см. 4.4) определяет его связанный объект.
Для других параметров не определено, передаётся ли параметр по значению или по ссылке.
Ограниченные (времени выполнения) ошибки
Если одно имя обозначает часть формального параметра, а второе имя обозначает часть другого формального параметра или объекта, который не является частью формального параметра, то эти два имени считаются различными путями доступа. Если объект имеет тип, для которого механизм передачи параметров не указан и не является явно псевдонимизированным параметром, то присвоение объекту через один путь доступа, а затем чтение значения объекта через другой путь доступа является ошибкой. Это происходит, если первый путь доступа не обозначает часть формального параметра, который больше не существует в точке второго доступа (из-за выхода из соответствующей вызываемой конструкции). Возможные последствия: повышение Program_Error, чтение только что присвоенного значения или чтение некоторого старого значения объекта.
ПРИМЕЧАНИЕ 1 Режим формального параметра описывает направление передачи информации в подпрограмму или из неё (см. subprogram_body) (см. 6.1).
ПРИМЕЧАНИЕ 2 Формальный параметр с режимом in — это представление константы (см. 3.3); его нельзя обновить в subprogram_body.
ПРИМЕЧАНИЕ 3 Формальный параметр с режимом out может быть неинициализированным в начале subprogram_body (см. 6.4.1).