Comparison operators
Сравнивает аргументы.
| Название оператора | Синтаксис | Перегружаемый оператор | Примеры прототипов (для class T ) | |
|---|---|---|---|---|
| Внутри определения класса | Вне определения класса | |||
| Равно |
a == b
|
Да | bool T :: operator == ( const U & b ) const ; | bool operator == ( const T & a, const U & b ) ; |
| Не равно |
a != b
|
Да | bool T :: operator ! = ( const U & b ) const ; | bool operator ! = ( const T & a, const U & b ) ; |
| Меньше чем |
a < b
|
Да | bool T :: operator < ( const U & b ) const ; | bool operator < ( const T & a, const U & b ) ; |
| Больше |
a > b
|
Да | bool T :: operator > ( const U & b ) const ; | bool operator > ( const T & a, const U & b ) ; |
| Меньше или равно |
a <= b
|
Да | bool T :: operator <= ( const U & b ) const ; | bool operator <= ( const T & a, const U & b ) ; |
| Больше или равно |
a >= b
|
Да | bool T :: operator >= ( const U & b ) const ; | bool operator >= ( const T & a, const U & b ) ; |
| Трехстороннее сравнение (C++20) |
a <=> b
|
Да |
R
T
::
operator
<=>
(
const
U
&
b
)
const
;
[1]
|
R
operator
<=>
(
const
T
&
a,
const
U
&
b
)
;
[1]
|
|
||||
Содержание |
Двустороннее сравнение
Выражения операторов двустороннего сравнения имеют вид
Операторы отношения
lhs
<
rhs
|
(1) | ||||||||
lhs
>
rhs
|
(2) | ||||||||
lhs
<=
rhs
|
(3) | ||||||||
lhs
>=
rhs
|
(4) | ||||||||
` и `
` содержит только операторы сравнения C++ (`<`, `>`, `<=`, `>=`)
- Термины `lhs` и `rhs` являются стандартными C++ терминами (left-hand side, right-hand side) и не переводятся
- Цифры в скобках `(1)`, `(2)`, `(3)`, `(4)` являются нумерацией и не требуют перевода
Содержимое полностью соответствует исходному с сохранением форматирования и всех технических элементов.
Операторы равенства
lhs
==
rhs
|
(5) | ||||||||
lhs
!=
rhs
|
(6) | ||||||||
Встроенные операторы двустороннего сравнения
Для встроенных операторов двустороннего сравнения, lvalue-to-rvalue conversions , array-to-pointer conversions (until C++26) и function-to-pointer conversions применяются к lhs и rhs .
|
Сравнение считается устаревшим, если и lhs , и rhs имеют тип массива до применения этих преобразований. |
(since C++20)
(until C++26) |
|
Для встроенных операторов отношения, если один из операндов является указателем, преобразование массива в указатель выполняется для другого операнда. Для встроенных операторов равенства, если один из операндов является указателем или константой нулевого указателя , преобразование массива в указатель выполняется для другого операнда. |
(since C++26) |
Для встроенных операторов двухстороннего сравнения результатом является bool prvalue.
Встроенное арифметическое сравнение
Если преобразованные операнды оба имеют арифметический тип или тип перечисления (scoped или unscoped), usual arithmetic conversions выполняются для обоих операндов. Значения сравниваются после преобразований:
#include <iostream> int main() { static_assert(sizeof(unsigned char) < sizeof(int), "Cannot compare signed and smaller unsigned properly"); int a = -1; int b = 1; unsigned int c = 1; unsigned char d = 1; std::cout << std::boolalpha << "Comparing two signed values:\n" " -1 == 1 ? " << (a == b) << "\n" " -1 < 1 ? " << (a < b) << "\n" " -1 > 1 ? " << (a > b) << "\n" "Comparing signed and unsigned:\n" // may issue different-signedness warning: " -1 == 1 ? " << (a == c) << "\n" // may issue different-signedness warning: " -1 < 1 ? " << (a < c) << "\n" // may issue different-signedness warning: " -1 > 1 ? " << (a > c) << "\n" "Comparing signed and smaller unsigned:\n" " -1 == 1 ? " << (a == d) << "\n" " -1 < 1 ? " << (a < d) << "\n" " -1 > 1 ? " << (a > d) << '\n'; }
Вывод:
Comparing two signed values: -1 == 1 ? false -1 < 1 ? true -1 > 1 ? false Comparing signed and unsigned: -1 == 1 ? false -1 < 1 ? false -1 > 1 ? true Comparing signed and smaller unsigned: -1 == 1 ? false -1 < 1 ? true -1 > 1 ? false
Встроенное сравнение указателей на равенство
Преобразованные операнды операторов равенства
==
и
!=
также могут иметь
тип
std::nullptr_t
,
(начиная с C++11)
указательный тип или тип указателя на член.
Встроенное сравнение указателей на равенство имеет три возможных результата: равны, не равны и не определено. Значения, возвращаемые операторами равенства для встроенного сравнения указателей, перечислены ниже:
|
Результат сравнения
между p и q |
Значение, возвращаемое | |
|---|---|---|
| p == q | p ! = q | |
| равны | true | false |
| не равны | false | true |
| неопределённый | неопределённое bool значение | |
Если хотя бы один из преобразованных lhs и rhs является указателем, преобразования указателей , преобразования указателей на функции (начиная с C++17) и квалификационные преобразования выполняются над обоими преобразованными операндами, чтобы привести их к их составному типу указателя . Два указателя составного типа указателя сравниваются следующим образом:
- Если один указатель представляет адрес полного объекта, а другой указатель
-
- представляет адрес за пределами другого полного не-массивного объекта, или
- представляет адрес за последним элементом другого полного массива,
- результат сравнения не определён.
- В противном случае, если оба указателя являются нулевыми, оба указывают на одну и ту же функцию или оба представляют один и тот же адрес (т.е. они указывают на один и тот же объект или за его конец), они сравниваются как равные.
- В противном случае указатели сравниваются как неравные.
Если хотя бы один из преобразованных lhs и rhs является указателем на член, преобразования указателей на члены , преобразования указателей на функции (начиная с C++17) и квалификационные преобразования выполняются над обоими преобразованными операндами, чтобы привести их к их составному типу указателя . Два указателя на члены составного типа указателя сравниваются следующим образом:
- Если два указателя на члены являются нулевыми указателями на члены, они сравниваются как равные.
- Если только один из двух указателей на члены является нулевым указателем на член, они сравниваются как неравные.
- Если хотя бы один из них является указателем на виртуальную функцию-член , результат не определён.
-
Если один ссылается на член класса
C1, а другой ссылается на член другого классаC2, где ни один не является базовым классом для другого, результат не определён. - Если оба ссылаются на (возможно, разные) члены одного и того же объединения , они сравниваются как равные.
- В остальных случаях два указателя на члены сравниваются как равные, если они ссылаются на один и тот же член одного и того же наиболее производного объекта или одного и того же подобъекта при выполнении косвенного обращения с гипотетическим объектом ассоциированного типа класса, в противном случае они сравниваются как неравные.
struct P {}; struct Q : P { int x; }; struct R : P { int x; }; int P::*bx = (int(P::*)) &Q::x; int P::*cx = (int(P::*)) &R::x; bool b1 = (bx == cx); // не определено struct B { int f(); }; struct L : B {}; struct R : B {}; struct D : L, R {}; int (B::*pb)() = &B::f; int (L::*pl)() = pb; int (R::*pr)() = pb; int (D::*pdl)() = pl; int (D::*pdr)() = pr; bool x = (pdl == pdr); // false bool y = (pb == pl); // true
|
Два операнда типа std::nullptr_t или один операнд типа std::nullptr_t и другой - нулевая константа указателя, сравниваются как равные. |
(since C++11) |
Встроенное реляционное сравнение указателей
Преобразованные операнды операторов отношения
>
,
<
,
>=
и
<=
также могут иметь тип указателя.
Встроенное отношение сравнения неравных указателей p и q имеет три возможных результата: p больше, q больше и неопределённый результат. Значения, возвращаемые операторами отношения для встроенного сравнения указателей, приведены ниже:
|
Результат сравнения
между p и q |
Значение, возвращаемое | |||
|---|---|---|---|---|
| p > q | p < q | p >= q | p <= q | |
| равны | false | false | true | true |
| p больше | true | false | true | false |
| q больше | false | true | false | true |
| неопределённый | неопределённое bool значение | |||
Если преобразованные lhs и rhs оба являются указателями, преобразования указателей , преобразования указателей на функции (начиная с C++17) и квалификационные преобразования выполняются над обоими преобразованными операндами для приведения их к их составному типу указателя . Два указателя составного типа указателя сравниваются следующим образом:
- Если указатели сравниваются равными или результат сравнения на равенство не определён, результат реляционного сравнения попадает в ту же категорию.
- В противном случае (если указатели сравниваются неравными), если любой из указателей не является указателем на объект, результат не определён.
- В противном случае (оба указателя указывают на объекты), результат определяется в терминах частичного порядка, согласованного со следующими правилами:
-
- Если даны два различных элемента high и low массива, причем high имеет больший индекс, чем low , и если один указатель указывает на high (или подобъект high ), а другой указатель указывает на low (или подобъект low ), то первый указатель считается большим, чем второй.
- Если один указатель указывает на элемент elem (или на подобъект elem ) массива, а другой указатель указывает за пределы того же массива, то указатель за пределами массива считается большим, чем другой указатель.
- Если один указатель указывает на полный объект, подобъект базового класса или подобъект-член obj (или на подобъект obj ), а другой указатель указывает за пределы obj , то указатель за пределами считается большим, чем другой указатель.
-
- Если указатели указывают на разные non-zero-sized (since C++20) нестатические члены данных с одинаковым member access (until C++23) одного объекта типа не-объединения, или на подобъекты таких членов, рекурсивно, то указатель на позже объявленный член сравнивается как больший, чем другой указатель.
- В противном случае результат не определён.
Полный порядок указателей
В каждой программе существует определяемый реализацией строгий полный порядок над указателями . Этот строгий полный порядок согласован с частичным порядком, описанным выше: неопределённые результаты становятся определяемыми реализацией, тогда как остальные результаты остаются неизменными.
Сравнение указателей со строгим полным порядком применяется в следующих случаях:
- Вызов operator ( ) специализаций для указателей std::less , std::greater , std::less_equal и std::greater_equal .
|
(начиная с C++14) |
|
(начиная с C++20) |
Перегрузки
В
разрешении перегрузки для пользовательских операторов
, для каждой пары продвинутых арифметических типов
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
)
;
|
||
Для каждого типа
P
, который является либо указателем на объект, либо указателем на функцию, следующие сигнатуры функций участвуют в разрешении перегрузки:
|
bool
operator
<
(
P, P
)
;
|
||
|
bool
operator
>
(
P, P
)
;
|
||
|
bool
operator
<=
(
P, P
)
;
|
||
|
bool
operator
>=
(
P, P
)
;
|
||
|
bool
operator
==
(
P, P
)
;
|
||
|
bool
operator
!
=
(
P, P
)
;
|
||
Для каждого типа
MP
, который является указателем на член-объект или указателем на член-функцию
или
std::nullptr_t
(начиная с C++11)
, следующие сигнатуры функций участвуют в разрешении перегрузки:
|
bool
operator
==
(
MP, MP
)
;
|
||
|
bool
operator
!
=
(
MP, MP
)
;
|
||
`, `
`, `
#include <iostream> struct Foo { int n1; int n2; }; union Union { int n; double d; }; int main() { std::cout << std::boolalpha; char a[4] = "abc"; char* p1 = &a[1]; char* p2 = &a[2]; std::cout << "Pointers to array elements:\n" << "p1 == p2? " << (p1 == p2) << '\n' << "p1 < p2? " << (p1 < p2) << '\n'; Foo f; int* p3 = &f.n1; int* p4 = &f.n2; std::cout << "Pointers to members of a class:\n" << "p3 == p4? " << (p3 == p4) << '\n' << "p3 < p4? " << (p3 < p4) << '\n'; Union u; int* p5 = &u.n; double* p6 = &u.d; std::cout << "Pointers to members of a union:\n" << "p5 == (void*)p6? " << (p5 == (void*)p6) << '\n' << "p5 < (void*)p6? " << (p5 < (void*)p6) << '\n'; }
Вывод:
Pointers to array elements: p1 == p2? false p1 < p2? true Pointers to members of a class: p3 == p4? false p3 < p4? true Pointers to members of a union: p5 == (void*)p6? true p5 < (void*)p6? false
Трехстороннее сравнениеВыражения оператора трёхстороннего сравнения имеют вид
` сохраняется без изменений
- Переменные `a` и `b` являются C++ специфичными терминами и не переводятся
- Оператор `<=>` (spaceship operator) является C++ оператором и сохраняется как есть
Выражение возвращает объект, такой что
Если один из операндов имеет тип bool а другой - нет, программа является некорректной. Если оба операнда имеют арифметические типы, или если один операнд имеет тип неограниченного перечисления, а другой — целочисленный тип, к операндам применяются обычные арифметические преобразования, и затем
Если оба операнда имеют один и тот же тип перечисления
Если хотя бы один из операндов является указателем на объект или указателем на член, преобразования массива в указатель , преобразования указателей и квалификационные преобразования применяются к обоим операндам для приведения их к их составному типу указателя . Для преобразованных операндов-указателей p и q , p <=> q возвращает prvalue типа std::strong_ordering :
В противном случае программа является некорректно сформированной.
Перегрузки
В
разрешении перегрузки для пользовательских операторов
, для указателя или перечислимого типа
Где
Запустить этот код
#include <compare> #include <iostream> int main() { double foo = -0.0; double bar = 0.0; auto res = foo <=> bar; if (res < 0) std::cout << "-0 is less than 0"; else if (res > 0) std::cout << "-0 is greater than 0"; else if (res == 0) std::cout << "-0 and 0 are equal"; else std::cout << "-0 and 0 are unordered"; } Вывод: -0 and 0 are equal |
(начиная с C++20) | |||||||||||||||||||||||||||||
Примечания
Поскольку операторы сравнения группируются слева направо, выражение a < b < c разбирается как ( a < b ) < c , а не как a < ( b < c ) или ( a < b ) && ( b < c ) .
#include <iostream> int main() { int a = 3, b = 2, c = 1; std::cout << std::boolalpha << (a < b < c) << '\n' // true; возможно предупреждение << ((a < b) < c) << '\n' // true << (a < (b < c)) << '\n' // false << ((a < b) && (b < c)) << '\n'; // false }
Общим требованием для пользовательского operator< является строгое слабое упорядочение . В частности, это требуется стандартными алгоритмами и контейнерами, работающими с Compare типами: std::sort , std::max_element , std::map и др.
Результат сравнения указателей на разные нестатические члены-данные одного класса подразумевает, что нестатические члены-данные в каждом из трёх режимов доступа к членам (до C++23) расположены в памяти в порядке объявления.
Хотя результат сравнения указателей случайного происхождения (например, не все указывают на элементы одного массива) не определён, многие реализации предоставляют строгий полный порядок для указателей, например, если они реализованы как адреса в непрерывном виртуальном адресном пространстве. Те реализации, которые этого не делают (например, где не все биты указателя являются частью адреса памяти и должны игнорироваться при сравнении, или требуется дополнительное вычисление, или иным образом указатель и целое число не находятся в отношении 1 к 1), предоставляют специализацию std::less для указателей, которая даёт такую гарантию. Это позволяет использовать все указатели случайного происхождения в качестве ключей в стандартных ассоциативных контейнерах, таких как std::set или std::map .
Для типов, которые являются одновременно EqualityComparable и LessThanComparable , стандартная библиотека C++ проводит различие между равенством , которое определяется значением выражения a == b и эквивалентностью , которая определяется значением выражения ! ( a < b ) && ! ( b < a ) .
Сравнение между указателями и константами нулевого указателя было удалено в результате решения CWG issue 583 включенного в N3624 :
void f(char* p) { if (p > 0) { /*...*/ } // Ошибка с N3624, компилировалось до N3624 if (p > nullptr) { /*...*/ } // Ошибка с N3624, компилировалось до N3624 } int main() {}
Трехстороннее сравнение может быть автоматически сгенерировано для типов классов, см. default comparisons .
Если оба операнда являются массивами, трёхстороннее сравнение некорректно.
unsigned int i = 1; auto r = -1 < i; // существующая проблема: возвращает 'false' auto r2 = -1 <=> i; // Ошибка: требуется сужающее преобразование
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_impl_three_way_comparison
|
201907L
|
(C++20) | Трехстороннее сравнение (поддержка компилятора) |
__cpp_lib_three_way_comparison
|
201907L
|
(C++20) | Трехстороннее сравнение (поддержка библиотеки); добавление трехстороннего сравнения в библиотеку |
Стандартная библиотека
Операторы сравнения перегружены для многих классов в стандартной библиотеке.
|
(удалено в C++20)
|
проверяет, ссылаются ли объекты на один и тот же тип
(публичная функция-член
std::type_info
)
|
|
(удалено в C++20)
(удалено в C++20)
(C++20)
|
сравнивает два
error_code
(функция) |
|
(удалено в C++20)
(удалено в C++20)
(C++20)
|
сравнивает объекты
error_condition
и
error_code
(функция) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения в
pair
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения в кортеже
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает содержимое
(публичная функция-член
std::bitset<N>
)
|
|
(удалено в C++20)
|
сравнивает два экземпляра аллокатора
(публичная функция-член
std::allocator<T>
)
|
|
(удалено в C++20)
(C++20)
|
сравнивает с другим
unique_ptr
или с
nullptr
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
сравнивает с другим
shared_ptr
или с
nullptr
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает
std::function
с
nullptr
(шаблон функции) |
|
(C++11)
(C++11)
(удалено в C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
сравнивает две длительности
(шаблон функции) |
|
(C++11)
(C++11)
(удалено в C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
сравнивает две точки времени
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает два
scoped_allocator_adaptor
объекта
(шаблон функции) |
|
(удалено в C++20)
(C++20)
|
сравнивает базовые
std::type_index
объекты
(публичная функция-член
std::type_index
)
|
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает две строки
(шаблон функции) |
|
(removed in C++20)
|
сравнение на равенство объектов локали
(публичная функция-член
std::locale
)
|
|
(C++11)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
array
s
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
deque
(шаблон функции) |
|
(C++11)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++11)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
forward_list
ов
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
list
ов
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
vector
ов
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
map
контейнеров
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
multimap
контейнеров
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
set
ов
(шаблон функции) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
multiset
ов
(шаблон функции) |
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает значения в unordered_map
(шаблон функции) |
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает значения в unordered_multimap
(шаблон функции) |
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает значения в unordered_set
(шаблон функции) |
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает значения в unordered_multiset
(шаблон функции) |
лексикографически сравнивает значения двух
queue
s
(шаблон функции) |
|
лексикографически сравнивает значения двух
stack
ов
(шаблон функции) |
|
|
сравнивает базовые итераторы
(шаблон функции) |
|
|
(C++11)
(C++11)
(удалено в C++20)
(C++11)
(C++11)
(C++11)
(C++11)
(C++20)
|
сравнивает базовые итераторы
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает два
istream_iterator
а
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает два
istreambuf_iterator
а
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает два комплексных числа или комплексное число и скаляр
(шаблон функции) |
|
сравнивает два valarray или valarray со значением
(шаблон функции) |
|
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает внутренние состояния двух генераторов псевдослучайных чисел
(функция) |
|
(C++11)
(C++11)
(removed in C++20)
|
сравнивает два объекта распределения
(функция) |
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
сравнивает
sub_match
с другим
sub_match
, строкой или символом
(шаблон функции) |
|
(удалено в C++20)
|
лексикографически сравнивает значения в двух результатах сопоставления
(шаблон функции) |
|
(удалено в C++20)
|
сравнивает два
regex_iterator
а
(публичная функция-член
std::regex_iterator<BidirIt,CharT,Traits>
)
|
|
(удалено в C++20)
|
сравнивает два
regex_token_iterator
а
(публичная функция-член
std::regex_token_iterator<BidirIt,CharT,Traits>
)
|
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
сравнивает два
thread::id
объекта
(функция) |
Пространство имен std::rel_ops предоставляет обобщенные операторы ! = , > , <= и >= :
|
Определено в заголовочном файле
<utility>
|
|
|
Определено в пространстве имён
std::rel_ops
|
|
|
(устарело в C++20)
|
автоматически генерирует операторы сравнения на основе пользовательских
operator
==
и
operator
<
(шаблон функции) |
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
|
CWG 583
( N3624 ) |
C++98 |
все шесть операторов сравнения могли использоваться для
сравнения указателя с константой нулевого указателя |
разрешены только операторы равенства
(equality operators) |
| CWG 661 | C++98 |
фактическая семантика арифметических сравнений (например,
возвращает ли 1 < 2 значение true или false ) была не определена |
добавлена спецификация |
| CWG 879 | C++98 |
указатели на типы функций и указатели
на void не имели встроенных операций сравнения |
добавлена спецификация сравнения
для этих указателей |
| CWG 1596 | C++98 |
не-массивные объекты считались принадлежащими массивам с
одним элементом только для целей арифметики указателей |
правило также
применяется к сравнению |
| CWG 1598 | C++98 |
два указателя на члены классов, которые различны и
ни один не является базовым классом другого, не сравнивались как равные, даже если смещения указываемых членов могут быть одинаковыми |
результат является
неопределённым в этом случае |
| CWG 1858 | C++98 |
было неясно, сравниваются ли два указателя на члены,
которые ссылаются на разные члены одного и того же объединения, как равные, как если бы они ссылались на один и тот же член |
они сравниваются
как равные в этом случае |
| CWG 2419 | C++98 |
указатель на не-массивный объект рассматривался как указатель на
первый элемент массива размером 1 только при сравнении указателей, если указатель получен с помощью
&
|
применяется ко всем указателям
на не-массивные объекты |
| CWG 2526 | C++98 |
определение реляционного сравнения (
>
,
>=
,
<
и
<=
)
указателей на void и указателей на функции было удалено в N3624 |
восстановлено |
| CWG 2796 | C++17 |
преобразования указателей на функции не выполнялись для преобразованных
указателей-операндов во время встроенных реляционных сравнений указателей |
выполняет эти
преобразования в этом случае |
Смотрите также
- Приоритет операторов
- Перегрузка операторов
- Compare (именованные требования)
| Общие операторы | ||||||
|---|---|---|---|---|---|---|
| assignment |
increment
decrement |
arithmetic | logical | comparison |
member
access |
other |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
вызов функции
a ( ... ) |
|
запятая
a, b |
||||||
|
условный оператор
a ? b : c |
||||||
| Специальные операторы | ||||||
|
static_cast
преобразует один тип в другой связанный тип
|
||||||
|
Документация C
для
Операторов сравнения
|