Spec-Zone.ru › Ada 2012
Справочное руководство по Ada 2012

4.1.5 Пользовательские ссылки

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

Для дискриминированного типа T может быть указан следующий операционный аспект, относящийся к типу:
Implicit_Dereference

Этот аспект задаётся именем, обозначающим дискриминант доступа, объявленный для типа T.
Тип (вид типа) с заданным аспектом Implicit_Dereference является типом ссылки. Объект ссылки — это объект типа ссылки. Дискриминант, указанный аспектом Implicit_Dereference, является дискриминантом ссылки типа ссылки или объекта ссылки. generalized_reference — это имя, идентифицирующее объект ссылки и обозначающее объект или подпрограмму, на которые указывает дискриминант ссылки объекта ссылки.

Синтаксис

generalized_reference ::= reference_object_имя

Правила разрешения имен

Ожидаемый тип для reference_object_имя в generalized_reference — любой тип ссылки.

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

Аспект Implicit_Dereference является неизменяемым (см. 13.1.1).
generalized_reference обозначает вид, эквивалентный виду разыменования дискриминанта ссылки объекта ссылки.
Для типа ссылки T аспект Implicit_Dereference наследуется потомками типа T, если не переопределён. Если дочерний тип ограничивает значение дискриминанта ссылки типа T новым дискриминантом, этот новый дискриминант является дискриминантом ссылки потомка. Если дочерний тип ограничивает значение дискриминанта ссылки типа T выражением, отличным от имени нового дискриминанта, generalized_reference, который идентифицирует объект дочернего типа, обозначает объект или подпрограмму, на которые указывает значение этого ограничивающего выражения.

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

Вычисление generalized_reference состоит из вычисления reference_object_имя и определения объекта или подпрограммы, на которые указывает дискриминант ссылки указанного объекта ссылки. Проверяется, что значение дискриминанта ссылки не является нулевым значением доступа. Если эта проверка не выполняется, возникает Constraint_Error. generalized_reference обозначает объект или подпрограмму, на которые указывает значение дискриминанта ссылки указанного объекта ссылки.

Примеры

type Barrel is tagged ... -- содержит объекты типа Element
type Ref_Element(Data : access Element) is limited private
with Implicit_Dereference => Data;
-- Этот тип Ref_Element является "типом ссылки".
-- "Data" — это его дискриминант ссылки.
function Find (B : aliased in out Barrel; Key : String) return Ref_Element;
-- Возвращает ссылку на элемент барабана.
B: aliased Barrel;
...
Find (B, "виноград") := Element'(...); -- Присваивание через ссылку.
-- Эквивалентно:
Find (B, "виноград").Data.all := Element'(...);


Spec-Zone.ru

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