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

operator==, !=, <, <=, >, >=, <=>(std::variant)

Материал из cppreference.com
< cpp‎ | utility‎ | variant
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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)
Целочисленные функции сравнения
(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)
 
 
Определено в заголовочном файле <variant>
template< class... Types >

constexpr bool operator==( const std::variant<Types...>& v,

                           const std::variant<Types...>& w );
(1)(начиная с C++17)
template< class... Types >

constexpr bool operator!=( const std::variant<Types...>& v,

                           const std::variant<Types...>& w );
(2)(начиная с C++17)
template< class... Types >

constexpr bool operator<( const std::variant<Types...>& v,

                          const std::variant<Types...>& w );
(3)(начиная с C++17)
template< class... Types >

constexpr bool operator>( const std::variant<Types...>& v,

                          const std::variant<Types...>& w );
(4)(начиная с C++17)
template< class... Types >

constexpr bool operator<=( const std::variant<Types...>& v,

                           const std::variant<Types...>& w );
(5)(начиная с C++17)
template< class... Types >

constexpr bool operator>=( const std::variant<Types...>& v,

                           const std::variant<Types...>& w );
(6)(начиная с C++17)
template< class... Types >

constexpr std::common_comparison_category_t<
    std::compare_three_way_result_t<Types>...>
    operator<=>( const std::variant<Types...>& v,

                 const std::variant<Types...>& w );
(7)(начиная с C++20)
1) Оператор равенства для variant'ов:
  • Если v.index() != w.index(), возвращает false;
  • иначе, если v.valueless_by_exception(), возвращает true;
  • иначе возвращает *std::get_if<v.index()>(std::addressof(v)) == *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) == *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
2) Оператор неравенства для variant'ов:
  • Если v.index() != w.index(), возвращает true;
  • иначе, если v.valueless_by_exception(), возвращает false;
  • иначе возвращает *std::get_if<v.index()>(std::addressof(v)) != *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) != *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
3) Оператор меньше чем для variant'ов:
  • Если w.valueless_by_exception(), возвращает false;
  • иначе, если v.valueless_by_exception(), возвращает true;
  • иначе, если v.index() < w.index(), возвращает true;
  • иначе, если v.index() > w.index(), возвращает false;
  • иначе возвращает *std::get_if<v.index()>(std::addressof(v)) < *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) < *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
4) Оператор больше чем для variant'ов:
  • Если v.valueless_by_exception(), возвращает false;
  • иначе, если w.valueless_by_exception(), возвращает true;
  • иначе, если v.index() > w.index(), возвращает true;
  • иначе, если v.index() < w.index(), возвращает false;
  • иначе возвращает *std::get_if<v.index()>(std::addressof(v)) > *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) > *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
5) Оператор меньше или равно для variant'ов:
  • Если v.valueless_by_exception(), возвращает true;
  • иначе, если w.valueless_by_exception(), возвращает false;
  • иначе, если v.index() < w.index(), возвращает true;
  • иначе, если v.index() > w.index(), возвращает false;
  • иначе возвращает *std::get_if<v.index()>(std::addressof(v)) <= *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) <= *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
6) Оператор больше или равно для variant'ов:
  • Если w.valueless_by_exception(), возвращает true;
  • иначе, если v.valueless_by_exception(), возвращает false;
  • иначе, если v.index() > w.index(), возвращает true;
  • иначе, если v.index() < w.index(), возвращает false;
  • иначе *std::get_if<v.index()>(std::addressof(v)) >= *std::get_if<v.index()>(std::addressof(w)). Поведение не определено (до C++20)Программа некорректна (начиная с C++20), если *std::get_if<i>(std::addressof(v)) >= *std::get_if<i>(std::addressof(w)) не является допустимым выражением, возвращающим тип, преобразуемый в bool, для любого i.
7) Оператор трёхстороннего сравнения для variant'ов:
  • Если и v.valueless_by_exception(), и w.valueless_by_exception() равны true, возвращает std::strong_ordering::equal;
  • иначе, если v.valueless_by_exception() равно true, возвращает std::strong_ordering::less;
  • иначе, если w.valueless_by_exception() равно true, возвращает std::strong_ordering::greater;
  • иначе, если v.index() != w.index(), возвращает v.index() <=> w.index();
  • иначе эквивалентно *std::get_if<v.index()>(std::addressof(v)) <=> *std::get_if<v.index()>(std::addressof(w)).

Содержание

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

v,wvariant'ы для стравнения

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

Результат сравнения описан выше.

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

#include <iostream>
#include <string>
#include <variant>
 
int main()
{
    std::cout << std::boolalpha;
    std::string cmp;
    bool result;
 
    auto print2 = [&cmp, &result](const auto& lhs, const auto& rhs) {
        std::cout << lhs << ' ' << cmp << ' ' << rhs << " : " << result << '\n';
    };
 
    std::variant<int, std::string> v1, v2;
 
    std::cout << "operator==\n";
    {
        cmp = "==";
 
        // по умолчанию v1 = 0, v2 = 0;
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
 
        v1 = v2 = 1;
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
 
        v2 = 2;
        result = v1 == v2; // false
        std::visit(print2, v1, v2);
 
        v1 = "A";
        result = v1 == v2; // false: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
 
        v2 = "B";
        result = v1 == v2; // false
        std::visit(print2, v1, v2);
 
        v2 = "A";
        result = v1 == v2; // true
        std::visit(print2, v1, v2);
    }
 
    std::cout << "operator<\n";
    {
        cmp = "<";
 
        v1 = v2 = 1;
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
 
        v2 = 2;
        result = v1 < v2; // true
        std::visit(print2, v1, v2);
 
        v1 = 3;
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
 
        v1 = "A"; v2 = 1;
        result = v1 < v2; // false: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
 
        v1 = 1; v2 = "A";
        result = v1 < v2; // true: v1.index == 0, v2.index == 1
        std::visit(print2, v1, v2);
 
        v1 = v2 = "A";
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
 
        v2 = "B";
        result = v1 < v2; // true
        std::visit(print2, v1, v2);
 
        v1 = "C";
        result = v1 < v2; // false
        std::visit(print2, v1, v2);
    }
 
    {
        std::variant<int, std::string> v1;
        std::variant<std::string, int> v2;
    //  v1 == v2;  // Ошибка компиляции: неизвестное преобразование
    }
 
    // TODO: оператор трёхстороннего сравнения C++20 <=> для variant'ов
}

Вывод:

operator==
0 == 0 : true
1 == 1 : true
1 == 2 : false
A == 2 : false
A == B : false
A == A : true
operator<
1 < 1 : false
1 < 2 : true
3 < 2 : false
A < 1 : false
1 < A : true
A < A : false
A < B : true
C < B : false

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

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
сравнивает объекты optional
(шаблон функции) [править]