Пространства имён
Варианты
Действия

std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal

Материал из cppreference.com
< cpp‎ | utility
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
cmp_equalcmp_lesscmp_less_than
(C++20)(C++20)(C++20)    
cmp_not_equalcmp_greatercmp_greater_than
(C++20)(C++20)(C++20)
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Определено в заголовочном файле <utility>
template<class T, class U >
constexprbool cmp_equal( T t, U u )noexcept;
(1) (начиная с C++20)
template<class T, class U >
constexprbool cmp_not_equal( T t, U u )noexcept;
(2) (начиная с C++20)
template<class T, class U >
constexprbool cmp_less( T t, U u )noexcept;
(3) (начиная с C++20)
template<class T, class U >
constexprbool cmp_greater( T t, U u )noexcept;
(4) (начиная с C++20)
template<class T, class U >
constexprbool cmp_less_equal( T t, U u )noexcept;
(5) (начиная с C++20)
template<class T, class U >
constexprbool cmp_greater_equal( T t, U u )noexcept;
(6) (начиная с C++20)

Сравнивает значения двух целых чисел t и u. В отличие от встроенных операторов сравнения, отрицательные целые числа со знаком всегда при сравнении меньшене равны) целых чисел без знака: сравнение защищено от преобразования целых чисел с потерями.

-1> 0u;// true std::cmp_greater(-1, 0u);// false

Это ошибка времени компиляции, если T или U не являются целыми числами со знаком или без знака (включая стандартный целочисленный тип и расширенный целочисленный тип).

Содержание

[править]Параметры

t левый аргумент
u правый аргумент

[править]Возвращаемое значение

1)true, если t равна u.
2)true, если t не равна u.
3)true, если t меньше чем u.
4)true, если t больше чем u.
5)true, если t меньше или равна u.
6)true, если t больше или равна u.

[править]Возможная реализация

template<class T, class U>constexprbool cmp_equal(T t, U u)noexcept{ifconstexpr(std::is_signed_v<T>==std::is_signed_v<U>)return t == u;elseifconstexpr(std::is_signed_v<T>)return t >=0&&std::make_unsigned_t<T>(t)== u;elsereturn u >=0&&std::make_unsigned_t<U>(u)== t;}   template<class T, class U>constexprbool cmp_not_equal(T t, U u)noexcept{return!cmp_equal(t, u);}   template<class T, class U>constexprbool cmp_less(T t, U u)noexcept{ifconstexpr(std::is_signed_v<T>==std::is_signed_v<U>)return t < u;elseifconstexpr(std::is_signed_v<T>)return t <0||std::make_unsigned_t<T>(t)< u;elsereturn u >=0&& t <std::make_unsigned_t<U>(u);}   template<class T, class U>constexprbool cmp_greater(T t, U u)noexcept{return cmp_less(u, t);}   template<class T, class U>constexprbool cmp_less_equal(T t, U u)noexcept{return!cmp_less(u, t);}   template<class T, class U>constexprbool cmp_greater_equal(T t, U u)noexcept{return!cmp_less(t, u);}

[править]Примечание

Эти функции нельзя использовать для сравнения перечислений (включая std::byte), char, char8_t, char16_t, char32_t, wchar_t и bool.

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_integer_comparison_functions202002L(C++20)no section name

[править]Пример

В приведённом ниже примере может появиться предупреждение different signedness comparison, если он скомпилирован без соответствующего флага подавления предупреждений, например, -Wno-sign-compare (gcc/clang с -Wall -Wextra, смотрите также SO: отключение конкретного предупреждения).

#include <utility>   // Раскомментирование следующей строки отключит предупреждения// "знакового/беззнакового сравнения":// #pragma GCC diagnostic ignored "-Wsign-compare"   int main(){ static_assert( sizeof(int)==4);// предварительное условие   // Совершенно неожиданно static_assert(-1> 1U );//< предупреждение: сравнение знакового и беззнакового// так как после неявного преобразования -1 в тип RHS (`unsigned int`)// выражение эквивалентно: static_assert( 0xFFFFFFFFU > 1U ); static_assert( 0xFFFFFFFFU ==static_cast<unsigned>(-1));   // Напротив, семейство cmp_* сравнивает целые числа, как и ожидалось,// отрицательные целые числа со знаком всегда при сравнении меньше,// чем целые числа без знака: static_assert( std::cmp_less(-1, 1U )); static_assert( std::cmp_less_equal(-1, 1U )); static_assert(! std::cmp_greater(-1, 1U )); static_assert(! std::cmp_greater_equal(-1, 1U ));   //< предупреждение: сравнение знакового и беззнакового static_assert(-1== 0xFFFFFFFFU ); static_assert( std::cmp_not_equal(-1, 0xFFFFFFFFU ));}

[править]Смотрите также

функциональный объект, реализующий x == y
(шаблон класса)[править]
функциональный объект, реализующий x != y
(шаблон класса)[править]
функциональный объект, реализующий x < y
(шаблон класса)[править]
функциональный объект, реализующий x > y
(шаблон класса)[править]
функциональный объект, реализующий x <= y
(шаблон класса)[править]
функциональный объект, реализующий x >= y
(шаблон класса)[править]
функциональный объект, реализующий x == y
(класс)[править]
функциональный объект, реализующий x != y
(класс)[править]
функциональный объект, реализующий x < y
(класс)[править]
функциональный объект, реализующий x > y
(класс)[править]
функциональный объект, реализующий x <= y
(класс)[править]
функциональный объект, реализующий x >= y
(класс)[править]
функциональный объект, реализующий x <=> y
(класс)[править]
(C++20)
проверяет, находится ли целочисленное значение в диапазоне заданного целочисленного типа
(шаблон функции)[править]
предоставляет интерфейс для запроса свойств всех основных числовых типов.
(шаблон класса)[править]
close