4.1.5 User-Defined References
Static Semantics
1/3
{
AI05-0139-2}
Given a discriminated type T, the following
type-related operational aspect may be specified:
2/3
Implicit_Dereference
This aspect is specified by a name that denotes
an access discriminant declared for the type T.
2.a/3
Aspect Description
for Implicit_Dereference: Mechanism
for user-defined implicit .all.
3/3
{
AI05-0139-2}
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
4/3
Name Resolution Rules
5/3
Static Semantics
6/3
7/3
{
AI05-0139-2}
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
8/3
{
AI05-0139-2}
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
9/3
{
AI05-0139-2}
type Ref_Element(Data : access Element) is
new Ada.Finalization.Limited_Controlled with private
with Implicit_Dereference => Data;
-- This Ref_Element type is a "reference" type.
-- "Data" is its reference discriminant.
10/3
function Find(C : access Container; Key : String) return Ref_Element;
-- Return a reference to an element of a container
11/3
...
12/3
Find(C, "abc") := Element'(...); -- Assign through a reference
13/3
-- This is equivalent to:
-- Find(C, "abc").Data.all := Element'(...);
Extensions to Ada 2005
13.a/3
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe