6.6 Overloading of Operators
Name Resolution Rules
Each use of a unary or binary operator is equivalent
to a
function_call
with
function_prefix
being the corresponding
operator_symbol,
and with (respectively) one or two positional actual parameters being
the operand(s) of the operator (in order).
Discussion: {
AI05-0005-1}
This equivalence extends to uses of
function_call
in most other language rules. However, as often happens, the equivalence
is not perfect, as operator calls are not a
name,
while a
function_call
is a
name.
Thus, operator calls cannot be used in contexts that require a
name
(such as a rename of an object). A direct fix for this problem would
be very disruptive, and thus we have not done that. However, qualifying
an operator call can be used as a workaround in contexts that require
a
name.
Legality Rules
{
AI05-0143-1}
The
subprogram_specification
of a unary or binary operator shall have one or two parameters, respectively.
The parameters shall be of mode
in. A generic function instantiation
whose
designator
is an
operator_symbol
is only allowed if the specification of the generic function has the
corresponding number of parameters, and they are all of mode
in.
An explicit declaration of "/=" shall not
have a result type of the predefined type Boolean.
Static Semantics
{
AI05-0128-1}
An explicit declaration of "=" whose result type is Boolean
implicitly declares an operator "/=" that gives the complementary
result.
Discussion: {
AI05-0128-1}
A "/=" defined by this rule is considered user-defined, which
means that it will be inherited by a derived type. “User-defined”
means “not language-defined” for the purposes of inheritance,
that is anything other than predefined operators.
NOTE {
AI12-0440-1}
The operators "+" and "–" are both unary and
binary operators, and hence can be overloaded with both one- and two-parameter
functions.
Examples
Examples of user-defined
operators:
function "+" (Left, Right : Matrix) return Matrix;
function "+" (Left, Right : Vector) return Vector;
-- assuming that A, B, and C are of the type Vector
-- the following two statements are equivalent:
A := B + C;
A := "+"(B, C);
Extensions to Ada 83
Explicit declarations of
"=" are now permitted for any combination of parameter and
result types.
Explicit declarations of "/=" are
now permitted, so long as the result type is not Boolean.
Wording Changes from Ada 2005
{
AI05-0128-1}
Correction: Corrected the wording so that only explicit declarations
of "=" cause an implicit declaration of "/="; otherwise,
we could get multiple implicit definitions of "/=" without
an obvious way to chose between them.
{
AI05-0143-1}
Added wording so that operators only allow parameters of mode
in.
This was made necessary by the elimination elsewhere of the restriction
that function parameters be only of mode
in.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe