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) |
- Если
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.
- Если
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.
- Если
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.
- Если
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.
- Если
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.
- Если
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.
- Если и
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
См. также
|
(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