Функции операторов-кандидатов, которые представляют встроенные операторы, определенные в разделе[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
Для каждой пары (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 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