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

< cpp‎ | utility‎ | 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) `variant` 的相等运算符：

- 若 v.index() != w.index() ，则返回 `false` ；
- 否则，若 v.valueless_by_exception() ，则返回 `true` ；
- 否则返回 std::get<v.index()>(v) == std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) == std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

2) `variant` 的不相等运算符：

- 若 v.index() != w.index() ，则返回 `true` ；
- 否则，若 v.valueless_by_exception() ，则返回 `false` ；
- 否则返回 std::get<v.index()>(v) != std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) != std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

3) `variant` 的小于运算符：

- 若 w.valueless_by_exception() ，则返回 `false` ；
- 否则，若 v.valueless_by_exception() ，则返回 `true` ；
- 否则，若 v.index() < w.index() ，则返回`true` ；
- 否则，若 v.index() > w.index() ，则返回`false` ；
- 否则返回 std::get<v.index()>(v) < std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) < std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

4) `variant` 的大于运算符：

- 若 v.valueless_by_exception() ，则返回 `false` ；
- 否则，若 w.valueless_by_exception() ，则返回 `true` ；
- 否则，若 v.index() > w.index() ，则返回 `true` ；
- 否则，若 v.index() < w.index() ，则返回 `false` ；
- 否则返回 std::get<v.index()>(v) > std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) > std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

5) `variant` 的小于或等于运算符：

- 若 v.valueless_by_exception() ，则返回 `true` ；
- 否则，若 w.valueless_by_exception() ，则返回 `false` ；
- 否则，若 v.index() < w.index() ，则返回`true`；
- 否则，若 v.index() > w.index() ，则返回`false`；
- 否则返回 std::get<v.index()>(v) <= std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) <= std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

6) `variant` 的大于或等于运算符：

- 若 w.valueless_by_exception() ，则返回 `true` ；
- 否则，若 v.valueless_by_exception() ，则返回 `false` ；
- 否则，若 v.index() > w.index() ，则返回 `true` ；
- 否则，若 v.index() < w.index() ，则返回 `false` ；
- 否则返回 std::get<v.index()>(v) >= std::get<v.index()>(w) 。若对于任何一个 `i` ， std::get<i>(v) >= std::get<i>(w) 不是返回值能转换为 `bool` 的合法表达式，则行为未定义 (C++20 前)程序为谬构 (C++20 起)。

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<v.index()>(v) <=> std::get<v.index()>(w) 。

### 参数

v,w | - | 要比较的 `variant`

### 返回值

描述于上的比较结果。

### 示例

| 本节未完成 原因：暂无示例

### 参阅

operator==operator!=operator<operator<=operator>operator>=operator<=> (C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20) | 比较 `optional` 对象 (函数模板)