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
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 declaration of "=" whose result type is Boolean
implicitly declares an operator "/=" that gives the complementary
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.
The operators "+" and "–" are both unary and
binary operators, and hence can 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
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