Namespaces
Variants

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

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (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)



 
 
헤더 <variant>
template< class... Types >
constexpr bool operator==( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
에 정의됨 (1) (C++17부터)
template< class... Types >
constexpr bool operator!=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(2) (C++17부터)
template< class... Types >
constexpr bool operator<( const std::variant<Types...>& lhs,
                          const std::variant<Types...>& rhs );
(3) (C++17부터)
template< class... Types >
constexpr bool operator>( const std::variant<Types...>& lhs,
                          const std::variant<Types...>& rhs );
(4) (C++17부터)
template< class... Types >
constexpr bool operator<=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(5) (C++17부터)
template< class... Types >
constexpr bool operator>=( const std::variant<Types...>& lhs,
                           const std::variant<Types...>& rhs );
(6) (C++17부터)
template< class... Types >
constexpr std::common_comparison_category_t
              <std::compare_three_way_result_t<Types>...>
    operator<=>( const std::variant<Types...>& lhs,
                 const std::variant<Types...>& rhs );
(7) (C++20부터)
도우미 함수 템플릿
template< std::size_t I, class... Types >
constexpr const std::variant_alternative_t<I, std::variant<Types...>>&
    GET( const variant<Types...>& v );
(8) (설명 전용*)

std::variant 객체에 대한 비교 연산을 수행합니다.

1-7) 두 std::variant 객체 lhs와 rhs를 비교합니다. T의 해당 연산자를 사용하여) 포함된 값은 lhs와 rhs가 모두 동일한 인덱스에 해당하는 값을 포함하는 경우에만 비교됩니다. 그렇지 않으면
  • lhs는 과 같음 rhs(으)로 간주되는 경우는 lhs와 rhs가 모두 값을 포함하지 않는 경우에만 해당합니다.
  • lhs는 보다 작음 rhs(으)로 간주되는 경우는 rhs가 값을 포함하고 lhs가 포함하지 않거나, lhs.index()가 rhs.index()보다 작은 경우에만 해당합니다.
1-6) 이러한 각 함수에 대해 @이 해당 비교 연산자를 나타낸다고 가정합니다:

I의 일부 값에 대해 해당 표현식 GET <I>(lhs) @ GET <I>(rhs)이(가) 잘못된 형식이거나 결과를 bool로 변환할 수 없는 경우 프로그램의 형식이 잘못되었습니다.

(C++26까지)

이 오버로드는 I의 모든 값에 대해 해당 표현식 GET <I>(lhs) @ GET <I>(rhs)이(가) 잘 형성되고 그 결과가 bool로 변환 가능한 경우에만 오버로드 해결에 참여합니다.

(C++26부터)
8) 설명 전용 함수 템플릿 GET은(는) std::get(std::variant)처럼 동작하지만, std::bad_variant_access가 절대 발생하지 않는다는 점이 다릅니다.
I < sizeof...(Types)이(가) false인 경우 프로그램의 형식이 잘못되었습니다.
I == v.index()이(가) false인 경우 동작은 정의되지 않습니다.

매개변수

lhs,rhs - 비교할 변형들

반환값

연산자 두 피연산자 모두 값을 포함하는 경우
(let I be lhs. index ( ) and J be rhs. index ( ) )
lhs 또는 rhs 가 값이 없는 경우
(let lhs_empty be lhs. valueless_by_exception ( ) and rhs_empty be rhs. valueless_by_exception ( ) )
I 와 J 가 같음 I 와 J 가 다름
== GET  < I > ( lhs ) == GET  < I > ( rhs ) false lhs_empty && rhs_empty
! = GET  < I > ( lhs ) ! = GET  < I > ( rhs ) true lhs_empty ! = rhs_empty
< GET  < I > ( lhs ) < GET  < I > ( rhs ) lhs. index ( ) < rhs. index ( ) lhs_empty && ! rhs_empty
> GET  < I > ( lhs ) > GET  < I > ( rhs ) lhs. index ( ) > rhs. index ( ) ! lhs_empty && rhs_empty
<= GET  < I > ( lhs ) <= GET  < I > ( rhs ) lhs. index ( ) < rhs. index ( ) lhs_empty
>= GET  < I > ( lhs ) >= GET  < I > ( rhs ) lhs. index ( ) > rhs. index ( ) rhs_empty
<=> GET  < I > ( lhs ) <=> GET  < I > ( rhs ) lhs. index ( ) <=> rhs. index ( ) 아래 참조

다음 연산자의 경우: operator <=> :

참고 사항

기능 테스트 매크로 값 표준 기능
__cpp_lib_constrained_equality 202403L (C++26) std::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 객체 비교
(함수 템플릿)