16 Overloading [over]

16.6 Built-in operators [over.built]

Функции операторов-кандидатов, которые представляют встроенные операторы, определенные в разделе[expr] , указаны в этом подразделе. Эти функции-кандидаты участвуют в процессе разрешения перегрузки оператора, как описано в разделе,[over.match.oper] и не используются ни для каких других целей. [ Note: Поскольку встроенные операторы принимают только операнды с неклассовым типом, а разрешение перегрузки оператора происходит только тогда, когда выражение операнда изначально имеет класс или тип перечисления, разрешение перегрузки оператора может разрешаться во встроенный оператор только тогда, когда операнд имеет класс тип, который имеет определяемое пользователем преобразование в тип, не являющийся классом, подходящий для оператора, или когда операнд имеет тип перечисления, который может быть преобразован в тип, подходящий для оператора. Также обратите внимание, что некоторые из функций-кандидатов, приведенные в этом подпункте, более разрешительны, чем сами встроенные операторы. Как описано в[over.match.oper], после того, как встроенный оператор выбран путем разрешения перегрузки, выражение подчиняется требованиям для встроенного оператора, приведенным в пункте[expr], и, следовательно, любым дополнительным семантическим ограничениям, указанным там. Если есть написанный пользователем кандидат с тем же именем и типами параметров, что и встроенная операторная функция-кандидат, встроенная операторная функция скрыта и не включается в набор функций-кандидатов. ]end note

В этом подпункте этот термин promoted integral type используется для обозначения тех интегральных типов, которые сохраняются integral promotion (включая, например, int и, long но исключая, например char). Точно так же этот термин promoted arithmetic type относится к плавающим типам и расширенным целочисленным типам. [ Note: Во всех случаях, когда требуется расширенный целочисленный тип или расширенный арифметический тип, операнд перечислимого типа будет приемлемым посредством целых расширений. ]end note

В оставшейся части этого разделаvq обозначает либоvolatile квалификатор cv , либо его отсутствие.

Для каждой пары (T, vq), где T - арифметический тип, отличный отbool, существуют кандидатные операторные функции вида

vq T& operator++(vq T&);
T operator++(vq T&, int);

Для каждой пары (T, vq), где T - арифметический тип, отличный от bool, существуют кандидатные операторные функции вида

vq T& operator--(vq T&);
T operator--(vq T&, int);

Для каждой пары (T, vq), где T - тип объекта cv-Qualified или cv-unqualified, существуют кандидатные операторные функции вида

T*vq& operator++(T*vq&);
T*vq& operator--(T*vq&);
T*    operator++(T*vq&, int);
T*    operator--(T*vq&, int);

Для каждого типа объекта cv-qual или cv-unqualified Tсуществуют кандидатные операторные функции в форме

T&    operator*(T*);

Для каждого типа функции T , не имеющего cv-квалификаторов или a ref-qualifier, существуют операторные функции-кандидаты в форме

T&    operator*(T*);

Для каждого типаT существуют кандидатные операторные функции вида

T*    operator+(T*);

Для каждого продвинутого арифметического типа Tсуществуют кандидатные операторные функции вида

T operator+(T);
T operator-(T);

Для каждого продвигаемого интегрального типа Tсуществуют кандидатные операторные функции вида

T operator~(T);

Для каждого пятиэлементного (C1, C2, T, cv1, cv2), где C2 представляет собой тип класса, C1 имеет тот же тип , какC2 и является производным классомC2, и T представляет собой тип объекта или тип функции, существует кандидаты оператор функция вида

cv12 T& operator->*(cv1 C1*, cv2 T C2::*);

гдеcv12 объединениеcv1 иcv2. Тип возврата показан только для демонстрации; см.[expr.mptr.oper] определение типа результата оператора.

Для каждой пары продвинутых арифметических типов L и Rсуществуют кандидатные операторные функции вида

LR      operator*(L, R);
LR      operator/(L, R);
LR      operator+(L, R);
LR      operator-(L, R);
bool    operator<(L, R);
bool    operator>(L, R);
bool    operator<=(L, R);
bool    operator>=(L, R);
bool    operator==(L, R);
bool    operator!=(L, R);

где LR - результат обычных арифметических преобразований между типами L и R.

Для каждого типа объекта cv-qual или cv-unqualified T существуют кандидатные операторные функции в форме

T*      operator+(T*, std::ptrdiff_t);
T&      operator[](T*, std::ptrdiff_t);
T*      operator-(T*, std::ptrdiff_t);
T*      operator+(std::ptrdiff_t, T*);
T&      operator[](std::ptrdiff_t, T*);

Для каждого T, где T - указатель на тип объекта, существуют кандидатные операторные функции вида

std::ptrdiff_t   operator-(T, T);

Для каждогоT, гдеT - тип перечисления или тип указателя, существуют кандидатные операторные функции вида

bool    operator<(T, T);
bool    operator>(T, T);
bool    operator<=(T, T);
bool    operator>=(T, T);
bool    operator==(T, T);
bool    operator!=(T, T);

Для каждого указателя на типT или тип членаstd​::​nullptr_­t существуют функции оператора-кандидата в форме

bool    operator==(T, T);
bool    operator!=(T, T);

Для каждой пары продвинутых интегральных типов L и Rсуществуют кандидатные операторные функции вида

LR      operator%(L, R);
LR      operator&(L, R);
LR      operator^(L, R);
LR      operator|(L, R);
L       operator<<(L, R);
L       operator>>(L, R);

где LR - результат обычных арифметических преобразований между типами L и R.

Для каждой тройки (L, vq, R), где L представляет собой арифметический тип, и R это способствовало арифметического типа существуют кандидаты оператора функций вида

vq L&   operator=(vq L&, R);
vq L&   operator*=(vq L&, R);
vq L&   operator/=(vq L&, R);
vq L&   operator+=(vq L&, R);
vq L&   operator-=(vq L&, R);

Для каждой пары (T,vq), гдеT - любой тип, существуют кандидатные операторные функции вида

T*vq&   operator=(T*vq&, T*);

Для каждой пары (T, vq), где T - перечисление или указатель на тип члена, существуют кандидатные операторные функции вида

vq T&   operator=(vq T&, T);

Для каждой пары (T, vq), где T - тип объекта cv-Qualified или cv-unqualified, существуют кандидатные операторные функции вида

T*vq&   operator+=(T*vq&, std::ptrdiff_t);
T*vq&   operator-=(T*vq&, std::ptrdiff_t);

Для каждой тройки (L, vq, R), где L представляет собой интегральный тип, и R это способствовало интегрального типа существуют кандидаты оператора функций вида

vq L&   operator%=(vq L&, R);
vq L&   operator<<=(vq L&, R);
vq L&   operator>>=(vq L&, R);
vq L&   operator&=(vq L&, R);
vq L&   operator^=(vq L&, R);
vq L&   operator|=(vq L&, R);

Также существуют кандидатные операторные функции вида

bool    operator!(bool);
bool    operator&&(bool, bool);
bool    operator||(bool, bool);

Для каждой пары продвинутых арифметических типов L и Rсуществуют кандидатные операторные функции вида

LR      operator?:(bool, L, R);

где LR - результат обычных арифметических преобразований между типами L и R. [ Note: Как и все эти описания функций-кандидатов, это объявление служит только для описания встроенного оператора с целью разрешения перегрузки. Оператор «?:» не может быть перегружен. ]end note

Для каждого типа T, где T - указатель, указатель на член или тип перечисления с ограниченной областью действия, существуют кандидатные операторные функции в форме

T       operator?:(bool, T, T);