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) 用于变体的相等性运算符:
- 若 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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) == *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) != *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) < *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) > *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) <= *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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))。若对于任何
i
,*std::get_if<i>(std::addressof(v)) >= *std::get_if<i>(std::addressof(w)) 不是返回值能转换为 bool 的合法表达式,则行为未定义 (C++20 前)程序非良构 (C++20 起)。
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 = "=="; // 默认为 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 用于变体的三路比较运算符 <=> }
输出:
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 对象 (函数模板) |