operator==, !=, <, <=, >, >=, <=>(std::variant)
Материал из cppreference.com
Определено в заголовочном файле <variant> | ||
template< class... Types > constexpr bool operator==( const std::variant<Types...>& v, | (1) | (начиная с C++17) |
template< class... Types > constexpr bool operator!=( const std::variant<Types...>& v, | (2) | (начиная с C++17) |
template< class... Types > constexpr bool operator<( const std::variant<Types...>& v, | (3) | (начиная с C++17) |
template< class... Types > constexpr bool operator>( const std::variant<Types...>& v, | (4) | (начиная с C++17) |
template< class... Types > constexpr bool operator<=( const std::variant<Types...>& v, | (5) | (начиная с C++17) |
template< class... Types > constexpr bool operator>=( const std::variant<Types...>& v, | (6) | (начиная с C++17) |
template< class... Types > constexpr std::common_comparison_category_t< | (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,w | — | variant'ы для стравнения |
[править] Возвращаемое значение
Результат сравнения описан выше.
[править] Пример
Запустить этот код
#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 (шаблон функции) |