Руководство по Ada (Ada 2022)
6.6 Перегрузка операторов
Оператор — это функция, у которой идентификатор является символом_оператора. Операторы, как и другие функции, могут быть перегружены.
Правила разрешения имен
Каждое использование унарного или бинарного оператора эквивалентно вызову функции function_call с префиксом соответствующего символом_оператора и (соответственно) одним или двумя позиционными фактическими параметрами, представляющими операнды оператора (в порядке).
Правила легальности
subprogram_specification унарного или бинарного оператора должен иметь один или два параметра соответственно. Параметры должны иметь режим in. Инстанциация обобщённой функции, у которой идентификатор является символом_оператора, допускается только в том случае, если спецификация обобщённой функции имеет соответствующее количество параметров, и все они имеют режим in.
Default_expression не допускаются для параметров оператора (независимо от того, объявлен ли оператор с явной subprogram_specification или с помощью generic_instantiation).
Явное объявление "/=" не должно иметь тип результата предопределённого типа Boolean.
Статическая семантика
Явное объявление "=" с типом результата Boolean неявно объявляет оператор "/=" , возвращающий дополнительный результат.
ПРИМЕЧАНИЕ Операторы "+" и "–" являются одновременно унарными и бинарными операторами и, следовательно, могут быть перегружены функциями с одним и двумя параметрами.
Примеры
Примеры пользовательских операторов:
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);