Справочник по Ada (Ada 2022)
3.3 Объекты и именованные числа
Объекты создаются во время выполнения и содержат значение заданного типа. Объект может быть создан и инициализирован в рамках разработки объявления, вычисления аллокатора, агрегата или вызова_функции, или передаваясь в качестве параметра по значению. Перед освобождением памяти объекта, он завершается, если это необходимо (см. 7.6.1).
Статическая семантика
Все перечисленное ниже являются объектами:
- сущность, объявленная объявлением_объекта;
- формальный параметр подпрограммы, входа или обобщенной подпрограммы;
- обобщенный формальный объект;
- параметр цикла;
- параметр индекса повторной_ассоциации_компонента;
- параметр блока спецификации_блока;
- параметр выбора обработчика_исключения;
- индекс входа тела_входа;
- результат разыменования значения доступа к объекту (см. 4.1);
- возвращаемый объект функции;
- результат вычисления агрегата;
- преобразование значения или квалифицированное_выражение, операнд которого обозначает объект;
- компонент, срез или преобразование вида другого объекта.
Объект является либо постоянным объектом, либо переменным объектом. Аналогично, представление объекта является либо постоянным, либо переменным. Все представления постоянного элементарного объекта являются постоянными. Все представления постоянного составного объекта являются постоянными, за исключением частей, которые являются контролируемых или неизменно ограниченных типов; переменные представления этих частей и их подкомпонентов могут существовать. В этом смысле, объекты контролируемых и неизменно ограниченных типов являются внутренне изменяемыми. Постоянное представление объекта не может быть использовано для изменения его значения. Термины постоянный и переменный сами по себе относятся к постоянным и переменным представлениям объектов.
Постоянный объект известен как не имеющий переменных представлений, если у него нет части, которая является неизменно ограниченной, или контролируемого типа, приватного типа или приватного расширения.
Значение объекта считывается, когда вычисляется значение любой части объекта или когда вычисляется значение содержащего объекта. Значение переменной обновляется при выполнении присваивания любой части переменной или при выполнении присваивания содержащему объекту.
Является ли представление объекта постоянным или переменным, определяется определением представления. Следующие (и только они) представляют переменные:
- объект, объявленный объявлением_объекта без ключевого слова constant;
- формальный параметр режима in out или out;
- обобщенный формальный объект режима in out;
- компонент без дискриминатора переменной;
- срез переменной;
- параметр цикла, который указан как переменная для обобщенного цикла (см. 5.5.2);
- преобразование представления переменной;
- разыменование значения доступа к переменной;
- возвращаемый объект, объявленный расширенной_инструкцией_возврата без ключевого слова constant;
- текущий экземпляр типа, отличного от защищенного типа, если текущий экземпляр является объектом, а не значением (см. 8.6);
- Этот абзац был удален.
- текущий экземпляр защищенного блока, кроме как внутри тела защищенной функции этого защищенного блока или внутри функции, объявленной непосредственно внутри тела защищенного блока;
- ссылка_на_атрибут, где атрибут определен как обозначающий переменную (например, атрибут Storage_Pool - см. 13.11).
В месте определения представления объекта с представлением ассоциируется номинальный подтип. Номинальный тип представления является типом номинального подтипа представления. Фактический подтип объекта (то есть его подтип) может быть более ограниченным, чем номинальный подтип представления; он всегда более ограничен, если номинальный подтип является неопределенным подтипом. Подтип является неопределенным, если это неявный подтип массива или если у него есть неизвестные дискриминанты или неограниченные дискриминанты без значений по умолчанию (см. 3.7); в противном случае, подтип является определенным подтипом (все элементарные подтипы являются определенными подтипами). Подтип всего класса определяется как имеющий неизвестные дискриминанты и, следовательно, является неопределенным подтипом. Неопределенный подтип сам по себе не предоставляет достаточной информации для создания объекта; необходим дополнительный ограничение или явная инициализация выражение (см. 3.3.1). Компонент не может иметь неопределенный номинальный подтип.
Представление составного объекта известно как ограниченное, если:
- его номинальный подтип ограничен и не является неопределенным частичным представлением, и он не является преобразованием значения и не является квалифицированным_выражением; или
- его номинальный подтип неопределен; или
- его тип неизменно ограничен (см. 7.5); или
- это часть самостоятельной константы (включая обобщенный формальный объект режима in); или
- это часть формального параметра режима in; или
- это часть объекта, обозначаемого вызовом_функции или агрегатом; или
- это преобразование значения или квалифицированное_выражение, где операнд обозначает представление составного объекта, известного как ограниченное; или
- это часть постоянного возвращаемого объекта расширенной_инструкции_возврата; или
- это разыменование типа доступа, специфичного для пула, и ни один предок его типа не имеет ограниченного частичного представления.
Для определения в теле обобщения, является ли объект известным ограниченным:
- если подтип является потомком неопределенного обобщенного формального приватного или производного типа, и подтип не является неограниченным подтипом массива, он не считается неопределенным и считается имеющим ограниченное частичное представление;
- если подтип является потомком формального типа доступа, он не считается специфичным для пула.
Именованное число предоставляет имя для числового значения, известного на этапе компиляции. Оно объявляется с помощью объявления_числа.
ПРИМЕЧАНИЕ 1 Константа не может быть объектом назначения операции присваивания, ни передаваться как параметр in out или out между его инициализацией и завершением, если таковое имеется.
ПРИМЕЧАНИЕ 2 Значение постоянного объекта не может быть изменено после его инициализации, за исключением некоторых случаев, когда объект имеет контролируемую или неизменно ограниченную часть (см. 7.5, 7.6 и 13.9.1).
ПРИМЕЧАНИЕ 3 Номинальные и фактические подтипы элементарного объекта всегда одинаковы. Для дискриминированного или массивно-объекта, если номинальный подтип ограничен, то ограничен и фактический подтип.