Spec-Zone.ru › C++

Операторы сравнения

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

Название оператора Синтаксис Перегружаемый Примеры прототипов (для classT)
Внутри определения класса Вне определения класса
Равно 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. R — это возвращаемый тип operator<=> (см. ниже)

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

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

Операторы отношения
lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
Операторы равенства
lhs == rhs (5)
lhs != rhs (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 в противном случае.

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

Для встроенных операторов двухстороннего сравнения к lhs и rhs применяются преобразования lvalue в rvalue, преобразования массива в указатель(до C++26) и преобразования функции в указатель.

Сравнение устарело, если до применения этих преобразований и lhs, и rhs имеют тип массива.

(начиная с C++20)
(до C++26)

Для встроенных операторов отношения, если один из операндов является указателем, к другому операнду применяется преобразование массива в указатель.

Для встроенных операторов равенства, если один из операндов является указателем или константой нулевого указателя, к другому операнду применяется преобразование массива в указатель.

(начиная с C++26)

Для встроенных операторов двухстороннего сравнения результатом является prvalue типа bool.

Встроенное арифметическое сравнение

Если оба преобразованных операнда имеют арифметический или перечислимый тип (с областью видимости или без неё), к обоим операндам применяются обычные арифметические преобразования. Значения сравниваются после преобразований:

#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); // unspecified

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 и другой операнд, являющийся константой нулевого указателя, сравниваются как равные.

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

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

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

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

  • При вызове operator() специализаций std::less, std::greater, std::less_equal и std::greater_equal для типа указателя.
  • При вызове встроенных операторов сравнения указателей из operator() специализаций std::less<void>, std::greater<void>, std::less_equal<void> и std::greater_equal<void>.
(начиная с C++14)
  • При вызове встроенного operator<=>, сравнивающего указатели, из operator() std::compare_three_way.
  • При вызове встроенного operator==, сравнивающего указатели, из operator() std::ranges::equal_to и std::ranges::not_equal_to.
  • При вызове встроенного operator<, сравнивающего указатели, из operator() std::ranges::less, std::ranges::greater, std::ranges::less_equal и std::ranges::greater_equal.
(начиная с C++20)

Встроенное сравнение отражений

Два значения типа std::meta::info равны, если они:

  • являются нулевыми значениями отражения;
  • представляют значения, эквивалентные аргументам шаблона;
  • представляют один и тот же объект;
  • представляют одну и ту же сущность;
  • представляют одну и ту же аннотацию;
  • представляют одну и ту же связь прямого базового класса; или
  • представляют равные описания члена данных.

Обратите внимание, что отражение псевдонима типа или пространства имён не равно отражению типа или пространства имён, на которое указывает псевдоним.

(начиная с C++26)

Перегрузки

При разрешении перегрузки для пользовательских операторов для каждой пары продвинутых арифметических типов 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) либо std::meta::info(начиная с C++26), в разрешении перегрузки участвуют следующие сигнатуры функций:

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

Выражение возвращает объект, для которого выполняются условия:

  • (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:

  • std::strong_ordering::equal, если они равны,
  • std::strong_ordering::less, если q больше p,
  • std::strong_ordering::greater, если p больше q,
  • неопределённый результат, если результат двухстороннего сравнения не определён.

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

Перегрузки

При разрешении перегрузки для пользовательских операторов для типа указателя или перечислимого типа 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; maybe warning
        << ((a < b) < c) << '\n' // true
        << (a < (b < c)) << '\n' // false
        << ((a < b) && (b < c)) << '\n'; // false
}

Распространённое требование к пользовательскому оператору< — строгий слабый порядок. В частности, это требуется стандартными алгоритмами и контейнерами, работающими с типами Compare: std::sort, std::max_element, std::map и т. д.

Результат сравнения указателей на разные нестатические члены данных одного класса означает, что нестатические члены данных с каждым из трёх уровней доступа к членам(до C++23) размещаются в памяти в порядке объявления.

Хотя результат сравнения указателей произвольного происхождения (например, не указывающих все на члены одного массива) не определён, многие реализации обеспечивают для указателей строгий полный порядок, например, если они представлены адресами в непрерывном виртуальном адресном пространстве. Реализации, которые этого не делают (например, если не все биты указателя являются частью адреса памяти и их следует игнорировать при сравнении, требуется дополнительное вычисление либо указатели и целые числа не находятся во взаимно однозначном соответствии), предоставляют для указателей специализацию std::less, гарантирующую такое свойство. Это позволяет использовать указатели произвольного происхождения в качестве ключей в стандартных ассоциативных контейнерах, таких как std::set или std::map.

Для типов, которые являются одновременно EqualityComparable и LessThanComparable, стандартная библиотека C++ различает равенство, определяемое значением выражения a == b, и эквивалентность, определяемую значением выражения !(a < b) && !(b < a).

Сравнение указателей с константами нулевого указателя было удалено решением по проблеме CWG 583, включённым в N3624:

void f(char* p)
{
    if (p > 0) { /*...*/ } // Error with N3624, compiled before N3624
    if (p > nullptr) { /*...*/ } // Error with N3624, compiled before N3624
}

int main() {}

Трёхстороннее сравнение может генерироваться автоматически для типов классов; см. сравнения по умолчанию.

Если оба операнда являются массивами, трёхстороннее сравнение некорректно.

unsigned int i = 1;
auto r = -1 < i;    // existing pitfall: returns ‘false’
auto r2 = -1 <=> i; // Error: narrowing conversion required
Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_impl_three_way_comparison 201907L (C++20) Трёхстороннее сравнение (поддержка компилятором)
__cpp_lib_three_way_comparison 201907L (C++20) Трёхстороннее сравнение (поддержка библиотекой); добавление трёхстороннего сравнения в библиотеку

Стандартная библиотека

Операторы сравнения перегружены для многих классов стандартной библиотеки.

operator==operator!=
(удалён в C++20)
проверяет, ссылаются ли объекты на один и тот же тип
(открытая функция-член std::type_info)
operator==operator!=operator<operator<=>
(удалён в C++20)(удалён в C++20)(C++20)
сравнивает два объекта типа error_code
(функция)
operator==operator!=operator<operator<=>
(удалён в C++20)(удалён в C++20)(C++20)
сравнивает объекты типа error_condition и error_code
(функция)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения в pair
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения в кортеже
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает содержимое
(открытая функция-член std::bitset<N>)
operator==operator!=
(удалён в C++20)
сравнивает два экземпляра аллокатора
(открытая функция-член std::allocator<T>)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(C++20)
сравнивает с другим unique_ptr или с nullptr
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
сравнивает с другим shared_ptr или с nullptr
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает std::function с nullptr
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++11)(C++11)(удалён в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
сравнивает два интервала времени
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++11)(C++11)(удалён в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
сравнивает две временные точки
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает два объекта scoped_allocator_adaptor
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(C++20)
сравнивает базовые объекты std::type_index
(открытая функция-член std::type_index)
operator==operator!=operator<operator>operator<=operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает две строки
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнение объектов локали на равенство
(открытая функция-член std::locale)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(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
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов deque
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(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
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов list
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов vector
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов map
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов multimap
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов set
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
лексикографически сравнивает значения двух объектов multiset
(шаблон функции)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает значения в unordered_map
(шаблон функции)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает значения в unordered_multimap
(шаблон функции)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает значения в unordered_set
(шаблон функции)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает значения в unordered_multiset
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20)
лексикографически сравнивает значения двух объектов queue
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20)
лексикографически сравнивает значения двух объектов stack
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20)
сравнивает базовые итераторы
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++11)(C++11)(удалён в C++20)(C++11)(C++11)(C++11)(C++11)(C++20)
сравнивает базовые итераторы
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает два объекта istream_iterator
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает два объекта istreambuf_iterator
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает два комплексных числа или комплексное число со скаляром
(шаблон функции)
operator==operator!=operator<operator<=operator>operator>=
сравнивает два valarray или valarray со значением
(шаблон функции)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает внутренние состояния двух генераторов псевдослучайных чисел
(функция)
operator==operator!=
(C++11)(C++11)(удалён в C++20)
сравнивает два объекта распределения
(функция)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
сравнивает sub_match с другим sub_match, строкой или символом
(шаблон функции)
operator==operator!=
(удалён в C++20)
лексикографически сравнивает значения в двух объектах результатов сопоставления
(шаблон функции)
operator==operator!=
(удалён в C++20)
сравнивает два объекта regex_iterator
(открытая функция-член std::regex_iterator<BidirIt,CharT,Traits>)
operator==operator!=
(удалён в C++20)
сравнивает два объекта regex_token_iterator
(открытая функция-член std::regex_token_iterator<BidirIt,CharT,Traits>)
operator==operator!=operator<operator<=operator>operator>=operator<=>
(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(удалён в C++20)(C++20)
сравнивает два объекта thread::id
(функция)

Пространство имён std::rel_ops предоставляет универсальные операторы !=, >, <= и >=:

Определено в заголовке <utility>
Определено в пространстве имён std::rel_ops
operator!=operator>operator<=operator>=
(устарело в C++20)
автоматически генерирует операторы сравнения на основе определённых пользователем operator== и operator<
(шаблон функции)

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение согласно опубликованному стандарту Корректное поведение
CWG 583
(N3624)
C++98 все шесть операторов сравнения можно было использовать для
сравнения указателя с константой нулевого указателя
разрешены только
операторы равенства
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 (именованные требования)
Распространённые операторы
Присваивание Инкремент,
декремент
Арифметические Логические Сравнение Доступ к
членам
Прочие
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 преобразует один тип в другой, сочетая static_cast, const_cast и reinterpret_cast
new создаёт объекты с динамической длительностью хранения
delete разрушает объекты, ранее созданные выражением new, и освобождает полученную область памяти
sizeof запрашивает размер типа
sizeof... запрашивает размер пакета (начиная с C++11)
typeid запрашивает информацию о типе
noexcept проверяет, может ли выражение выбросить исключение (начиная с C++11)
alignof запрашивает требования к выравниванию типа (начиная с C++11)
^^ создаёт значение отражения из грамматической конструкции (начиная с C++26)

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/operator_comparison

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API