6.6 Overloading of Operators
Name Resolution Rules
Each use of a unary or binary operator is equivalent
to a function_call
being the corresponding operator_symbol
and with (respectively) one or two positional actual parameters being
the operand(s) of the operator (in order).
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
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.
An explicit A
declaration of "=" whose result type is Boolean implicitly
declares an operator a
"/=" that gives the complementary result.
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.
9 The operators "+" and "–"
are both unary and binary operators, and hence may be overloaded with
both one- and two-parameter functions.
Examples of user-defined
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
Explicit declarations of "/=" are
now permitted, so long as the result type is not Boolean.
Wording Changes from Ada 2005
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.
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