命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | utility‎ | variant
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库特性测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
定义在头文件 <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<v.index()>(v) == std::get<v.index()>(w)行为未定义(直到 C++20)程序格式不正确(自 C++20 起) 如果 std::get<i>(v) == std::get<i>(w) 不是返回可转换为 bool 的类型的有效表达式,对于任何 i
2) 变体的非相等运算符
  • 如果 v.index() != w.index(),则返回 true
  • 否则,如果 v.valueless_by_exception(),则返回 false
  • 否则,返回 std::get<v.index()>(v) != std::get<v.index()>(w)行为未定义(直到 C++20)程序格式不正确(自 C++20 起) 如果 std::get<i>(v) != std::get<i>(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<v.index()>(v) < std::get<v.index()>(w)行为未定义(直到 C++20)程序格式错误(自 C++20 起) 如果 std::get<i>(v) < std::get<i>(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<v.index()>(v) > std::get<v.index()>(w)行为未定义(直到 C++20)程序格式错误(自 C++20 起) 如果 std::get<i>(v) > std::get<i>(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<v.index()>(v) <= std::get<v.index()>(w)行为未定义(直到 C++20)程序格式错误(自 C++20 起) 如果 std::get<i>(v) <= std::get<i>(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<v.index()>(v) >= std::get<v.index()>(w)行为未定义(直到 C++20)程序格式错误(自 C++20 起) 如果 std::get<i>(v) >= std::get<i>(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<v.index()>(v) <=> std::get<v.index()>(w)

内容

[edit] 参数

v,w - 要比较的变量

[edit] 返回值

如上所述的比较结果。

[edit] 示例

#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

[edit] 另请参阅

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
比较 optional 对象
(函数模板) [edit]