Spec-Zone.ru › C++

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

Определено в заголовке <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) Оператор равенства для вариантов:
  • Если 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) Оператор неравенства для вариантов:
  • Если 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) Оператор меньше для вариантов:
  • Если 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) Оператор больше для вариантов:
  • Если 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) Оператор меньше или равно для вариантов:
  • Если 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) Оператор больше или равно для вариантов:
  • Если 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) Оператор сравнения для вариантов:
  • Если и 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,w - сравниваемые варианты

Возвращаемое значение

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

Пример

#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 = "==";
 
        // by default 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;  // Compilation error: no known conversion
    }
 
    // TODO: C++20 three-way comparison operator <=> for variants
}

Вывод:

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

См. также

operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
сравнивает объекты optional
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/variant/operator_cmp

Spec-Zone.ru

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