Бинарные и унарные операции
Бинарную операцию можно определить как функцию-член с одним параметром, или как глобальную функцию с двумя параметрами. Значит, для любой бинарной операции @ выражение aa @ bb интерпретируется либо как aa.operator(bb), либо как operator@(aa,bb). Если определены обе функции, то выбор интерпретации происходит по правилам сопоставления параметров (§R.13.2). Префиксная или постфиксная унарная операция может определяться как функция-член без параметров, или как глобальная функция с одними параметром. Для любой префиксной унарной операции @ выражение @aa интерпретируется либо как aa.operator@(), либо как operator@(aa). Если определены обе функции, то выбор интерпретации происходит по правилам сопоставления параметров (§R.13.2). Для любой постфиксной унарной операции @ выражение @aa интерпретируется либо как aa.operator@(int), либо как operator@(aa,int). Подробно это объясняется в §7.10. Если определены обе функции, то выбор интерпретации происходит по правилам сопоставления параметров (§13.2). Операцию можно определить только в соответствии с синтаксическими правилами, имеющимися для нее в грамматике С++.
В частности, нельзя определить % как унарную операцию, а + как тернарную. Проиллюстрируем сказанное примерами:
class X { // члены (неявно используется указатель `this'):
X* operator&(); // префиксная унарная операция & // (взятие адреса) X operator&(X); // бинарная операция & (И поразрядное) X operator++(int); // постфиксный инкремент X operator&(X,X); // ошибка: & не может быть тернарной X operator/(); // ошибка: / не может быть унарной };
// глобальные функции (обычно друзья)
X operator-(X); // префиксный унарный минус X operator-(X,X); // бинарный минус X operator--(X&,int); // постфиксный инкремент X operator-(); // ошибка: нет операнда X operator-(X,X,X); // ошибка: тернарная операция X operator%(X); // ошибка: унарная операция %
Операция [] описывается в §7.7, операция () в §7.8, операция -> в §7.9, а операции ++ и -- в §7.10.