Справочник по Ada 2012
6.6 Перегрузка операторов
Оператор — это функция, у которой обозначение является символом_оператора. Операторы, как и другие функции, могут быть перегружены.
Правила разрешения имен
Каждый вызов унарного или бинарного оператора эквивалентен вызову функции вызов_функции с префиксом_функции, являющимся соответствующим символом_оператора, и с (соответственно) одним или двумя позиционными фактическими параметрами, являющимися операндом(ами) оператора (в порядке).
Правила допустимости
Спецификация подпрограммы подпрограмма_спецификация унарного или бинарного оператора должна иметь один или два параметра соответственно. Параметры должны иметь режим in. Инкапсуляция порождающей функции, у которой обозначение является символом_оператора, допускается только в том случае, если спецификация порождающей функции имеет соответствующее количество параметров, и все они имеют режим in.
Выражение_по_умолчанию не допускается для параметров оператора (независимо от того, объявлен ли оператор с явной подпрограмма_спецификация или с помощью иннкапсуляция_порождающей_функции).
Явное объявление "/=" не должно иметь тип результата предопределенного типа Boolean.
Статическая семантика
Явное объявление "=" с типом результата Boolean неявно объявляет оператор "/=" , дающий дополнительный результат.
ПРИМЕЧАНИЯ
10 Операторы "+" и "–" являются как унарными, так и бинарными операторами и, следовательно, могут быть перегружены как функциями с одним, так и с двумя параметрами.
Примеры
Примеры пользовательских операторов:
function "+" (Left, Right : Matrix) return Matrix;
function "+" (Left, Right : Vector) return Vector;
-- предполагается, что A, B и C имеют тип Vector
-- следующие две инструкции эквивалентны:
A := B + C;
A := "+"(B, C);
function "+" (Left, Right : Vector) return Vector;
-- предполагается, что A, B и C имеют тип Vector
-- следующие две инструкции эквивалентны:
A := B + C;
A := "+"(B, C);