About the author
In order to refer to a particular class operator, prefix the operator name with the identifier escape character (&), eg, TFooBar.&&op_Addition(a, b). The internal name is &op_OperatorName, and you need the identifier escape character to get to it, thus, the double &&.
The above technique cannot be used to access conversion operators, since conversion operators include the result type in overload resolution and cannot be resolved by function overload selection rules.
The set of logical operators (LogicalAnd, LogicalOr, LogicalXor) is mutually exclusive with the set of bitwise operators. For AND, OR, and XOR syntax, the compiler will look first for the corresponding bitwise operator. If no bitwise operator is available on the operand types, the compiler will then look for logical operators on the operand types. It is not a syntax error to declare members of both groups in the same type, but if both exist on a type only the bitwise operators will be used by the compiler.
When an explicit typecast is specified, implicit conversion operators are also included in the search. Implicit operators are always checked first.
As a result of an explicit conversion, possible loss of information / irreversibility may occur. This does not occur for implicit conversions. Therefore, this leads to the corollary that implicit conversions are always checked first.
The class operator, BitwiseNot, DOES NOT EXIST. The Delphi language defines only the LogicalNot operator. It is up to the type to determine what "not" means. For booleans, "not" means logical not. For ordinals, "not" means bitwise not.
Error checking:An operator declaration must have the appropriate number of parameters (binary operator must have exactly 2 parameters).
In binary and unary operators, the type of at least one parameter must be the declaring type.
In conversion operators, the type of either the parameter or the result (but not both) must be the declaring type.