Ada 2012 Reference Manual
4.1.5 User-Defined References
Static Semantics
Given a discriminated type T, the following type-related operational aspect may be specified:
Implicit_Dereference
This aspect is specified by a name that denotes an access discriminant declared for the type T.
A (view of a) type with a specified Implicit_Dereference aspect is a reference type. A reference object is an object of a reference type. The discriminant named by the Implicit_Dereference aspect is the reference discriminant of the reference type or reference object. A generalized_reference is a name that identifies a reference object, and denotes the object or subprogram designated by the reference discriminant of the reference object.
Syntax
Name Resolution Rules
The expected type for the reference_object_name in a generalized_reference is any reference type.
Static Semantics
The Implicit_Dereference aspect is nonoverridable (see 13.1.1).
A generalized_reference denotes a view equivalent to that of a dereference of the reference discriminant of the reference object.
Given a reference type T, the Implicit_Dereference aspect is inherited by descendants of type T if not overridden. If a descendant type constrains the value of the reference discriminant of T by a new discriminant, that new discriminant is the reference discriminant of the descendant. If the descendant type constrains the value of the reference discriminant of T by an expression other than the name of a new discriminant, a generalized_reference that identifies an object of the descendant type denotes the object or subprogram designated by the value of this constraining expression.
Dynamic Semantics
The evaluation of a generalized_reference consists of the evaluation of the reference_object_name and a determination of the object or subprogram designated by the reference discriminant of the named reference object. A check is made that the value of the reference discriminant is not the null access value. Constraint_Error is raised if this check fails. The generalized_reference denotes the object or subprogram designated by the value of the reference discriminant of the named reference object.
Examples
type Barrel is tagged ... -- holds objects of type Element
type Ref_Element(Data : access Element) is limited private
with Implicit_Dereference => Data;
-- This Ref_Element type is a "reference" type.
-- "Data" is its reference discriminant.
with Implicit_Dereference => Data;
-- This Ref_Element type is a "reference" type.
-- "Data" is its reference discriminant.
function Find (B : aliased in out Barrel; Key : String) return Ref_Element;
-- Return a reference to an element of a barrel.
-- Return a reference to an element of a barrel.
B: aliased Barrel;
...
Find (B, "grape") := Element'(...); -- Assign through a reference.
-- This is equivalent to:
Find (B, "grape").Data.all := Element'(...);
Find (B, "grape").Data.all := Element'(...);