Справочное руководство по Ada 2012
4.1.5 Пользовательские ссылки
Статическая семантика
Для дискриминированного типа T может быть указан следующий операционный аспект, относящийся к типу:
Implicit_Dereference
Этот аспект задаётся именем, обозначающим дискриминант доступа, объявленный для типа T.
Тип (вид типа) с заданным аспектом Implicit_Dereference является типом ссылки. Объект ссылки — это объект типа ссылки. Дискриминант, указанный аспектом Implicit_Dereference, является дискриминантом ссылки типа ссылки или объекта ссылки. generalized_reference — это имя, идентифицирующее объект ссылки и обозначающее объект или подпрограмму, на которые указывает дискриминант ссылки объекта ссылки.
Синтаксис
Правила разрешения имен
Ожидаемый тип для 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" — это его дискриминант ссылки.
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'(...);
Find (B, "виноград").Data.all := Element'(...);