Namespaces
Variants

Comparison operators

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Сравнивает аргументы.

Название оператора Синтаксис Перегружаемый оператор Примеры прототипов (для 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]
Примечания
  • Там, где встроенные операторы возвращают bool , большинство пользовательских перегрузок также возвращают bool , чтобы пользовательские операторы можно было использовать так же, как встроенные. Однако в пользовательской перегрузке оператора может использоваться любой тип в качестве возвращаемого типа (включая void ).
  • U может быть любым типом, включая T .
  1. 1.0 1.1 R - это возвращаемый тип operator<=> ( см. ниже )

Содержание

Двустороннее сравнение

Выражения операторов двустороннего сравнения имеют вид

Операторы отношения
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
**Примечание:** В данном HTML-коде нет текста для перевода, так как: - Все HTML-теги и атрибуты сохранены без изменений - Текст внутри тегов ` ` и ` ` содержит только операторы сравнения C++ (`<`, `>`, `<=`, `>=`) - Термины `lhs` и `rhs` являются стандартными C++ терминами (left-hand side, right-hand side) и не переводятся - Цифры в скобках `(1)`, `(2)`, `(3)`, `(4)` являются нумерацией и не требуют перевода Содержимое полностью соответствует исходному с сохранением форматирования и всех технических элементов.
Операторы равенства
lhs == rhs (5)
lhs != rhs (6)
**Примечание:** В данном случае весь текст на странице состоит из C++ специфических терминов (`lhs`, `rhs`, `==`, `!=`) и HTML-разметки, которые согласно инструкциям не подлежат переводу. Числовые обозначения (5) и (6) также сохраняются в оригинальном виде как часть технической документации.
1) Возвращает true если lhs меньше rhs , false в противном случае.
2) Возвращает true если lhs больше чем rhs , false в противном случае.
3) Возвращает true если lhs меньше или равно rhs , false в противном случае.
4) Возвращает true если lhs больше или равен rhs , false в противном случае.
5) Возвращает true если lhs равен rhs , false в противном случае.
6) Возвращает true если lhs не равен rhs , false в противном случае.

Встроенные операторы двустороннего сравнения

Для встроенных операторов двустороннего сравнения, 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) одного объекта типа не-объединения, или на подобъекты таких членов, рекурсивно, то указатель на позже объявленный член сравнивается как больший, чем другой указатель.
  • В противном случае результат не определён.

Полный порядок указателей

В каждой программе существует определяемый реализацией строгий полный порядок над указателями . Этот строгий полный порядок согласован с частичным порядком, описанным выше: неопределённые результаты становятся определяемыми реализацией, тогда как остальные результаты остаются неизменными.

Сравнение указателей со строгим полным порядком применяется в следующих случаях:

(начиная с 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 ) ;
**Примечание:** Весь представленный код находится внутри тегов ` `, которые обозначают блоки кода C++. В соответствии с инструкциями, содержимое этих тегов не подлежит переводу, так как содержит синтаксис C++ и специфические термины языка. HTML-разметка и атрибуты сохранены без изменений.

Для каждого типа 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 ) ;
**Примечание:** Весь представленный код находится внутри тегов ` `, которые согласно инструкциям не подлежат переводу. Код содержит исключительно C++ синтаксис (ключевые слова, операторы, типы данных), который также не должен переводиться согласно требованиям.

Для каждого типа MP , который является указателем на член-объект или указателем на член-функцию или std::nullptr_t (начиная с C++11) , следующие сигнатуры функций участвуют в разрешении перегрузки:

bool operator == ( MP, MP ) ;
bool operator ! = ( MP, MP ) ;
**Примечание:** Весь представленный код находится внутри тегов ` `, которые содержат исключительно C++ код. Согласно вашим инструкциям, содержимое внутри тегов ` `, `
`, `` (и в данном случае C++ код) не переводится. HTML-разметка и атрибуты также сохранены без изменений.
#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
**Примечание:** В данном случае переводить нечего, так как: - HTML теги и атрибуты не переводятся - Текст внутри тегов ` ` сохраняется без изменений - Переменные `a` и `b` являются C++ специфичными терминами и не переводятся - Оператор `<=>` (spaceship operator) является C++ оператором и сохраняется как есть

Выражение возвращает объект, такой что

  • ( a <=> b ) < 0 если a < b ,
  • ( a <=> b ) > 0 если a > b ,
  • ( a <=> b ) == 0 если a и b равны/эквивалентны.

Если один из операндов имеет тип bool а другой - нет, программа является некорректной.

Если оба операнда имеют арифметические типы, или если один операнд имеет тип неограниченного перечисления, а другой — целочисленный тип, к операндам применяются обычные арифметические преобразования, и затем

  • Если требуется сужающее преобразование, кроме преобразования из целочисленного типа в тип с плавающей точкой, программа является некорректной.
  • В противном случае, если операнды имеют целочисленный тип, оператор возвращает prvalue типа std::strong_ordering :
  • std::strong_ordering::equal если оба операнда арифметически равны,
  • std::strong_ordering::less если первый операнд арифметически меньше второго,
  • std::strong_ordering::greater в противном случае.
  • В противном случае операнды имеют тип с плавающей запятой, и оператор возвращает prvalue типа std::partial_ordering . Выражение a <=> b возвращает
  • std::partial_ordering::less если a меньше b ,
  • std::partial_ordering::greater если a больше b ,
  • std::partial_ordering::equivalent если a эквивалентно b ( - 0 <=> + 0 эквивалентны),
  • std::partial_ordering::unordered ( NaN <=> anything неупорядочено).

Если оба операнда имеют один и тот же тип перечисления E , оператор возвращает результат преобразования операндов к базовому типу E и применения <=> к преобразованным операндам.

Если хотя бы один из операндов является указателем на объект или указателем на член, преобразования массива в указатель , преобразования указателей и квалификационные преобразования применяются к обоим операндам для приведения их к их составному типу указателя .

Для преобразованных операндов-указателей p и q , p <=> q возвращает prvalue типа std::strong_ordering :

В противном случае программа является некорректно сформированной.

Перегрузки

В разрешении перегрузки для пользовательских операторов , для указателя или перечислимого типа T , следующая сигнатура функции участвует в разрешении перегрузки:

R operator <=> ( T, T ) ;

Где R - это тип категории упорядочивания, определённый выше.

#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> )
сравнивает с другим 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 объекта
(шаблон функции)
сравнивает базовые 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
автоматически генерирует операторы сравнения на основе пользовательских 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 преобразования указателей на функции не выполнялись для преобразованных
указателей-операндов во время встроенных реляционных сравнений указателей
выполняет эти
преобразования в этом случае

Смотрите также

**Примечания к переводу:** - Слово "comma" переведено как "запятая" (термин оператора в C++) - Текст внутри тегов ` ` сохранен без изменений, так как содержит C++ код - Все HTML теги и атрибуты сохранены в оригинальном виде - Форматирование (теги `
`) сохранено без изменений
Общие операторы
assignment increment
decrement
arithmetic logical comparison member
access
other

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

вызов функции

a ( ... )
запятая

a, b
условный оператор

a ? b : c
Специальные операторы

static_cast преобразует один тип в другой связанный тип
dynamic_cast преобразует в пределах иерархий наследования
const_cast добавляет или удаляет cv -квалификаторы
reinterpret_cast преобразует тип в несвязанный тип
C-style приведение преобразует один тип в другой с помощью комбинации static_cast , const_cast и reinterpret_cast
new создает объекты с динамической продолжительностью хранения
delete уничтожает объекты, ранее созданные выражением new, и освобождает полученную область памяти
sizeof запрашивает размер типа
sizeof... запрашивает размер пакета (since C++11)
typeid запрашивает информацию о типе
noexcept проверяет, может ли выражение генерировать исключение (since C++11)
alignof запрашивает требования выравнивания типа (since C++11)

Документация C для Операторов сравнения