Namespaces
Variants

operator==(std::expected)

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
Swap 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
기본 템플릿
template< class T2, class E2 >
    requires (!std::is_void_v<T2>)
friend constexpr bool operator==( const expected& lhs,
                                  const std::expected<T2, E2>& rhs );
(1) (C++23부터)
template< class E2 >
friend constexpr bool operator==( const expected& lhs,
                                  const std::unexpected<E2>& unex );
(2) (C++23부터)
template< class T2 >
friend constexpr bool operator==( const expected& lhs, const T2& val );
(3) (C++23부터)
void 부분 특수화
template< class T2, class E2 >
  requires std::is_void_v<T2>
friend constexpr bool operator==( const expected& lhs,
                                  const std::expected<T2, E2>& rhs );
(4) (C++23부터)
template< class E2 >
friend constexpr bool operator==( const expected& lhs,
                                  const std::unexpected<E2>& unex );
(5) (C++23부터)

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

1) 두 std::expected 객체를 비교합니다. 두 객체는 lhs와 rhs가 모두 동일한 예상 값을 포함하거나, 둘 다 동일한 예상치 못한 값을 포함하는 경우에만 같습니다.

다음 표현식 중 하나라도 제대로 구성되지 않았거나 그 결과를 bool로 변환할 수 없는 경우 프로그램은 제대로 구성되지 않습니다:

(C++26까지)

이 오버로드는 다음 모든 표현식이 제대로 구성되고 그 결과를 bool로 변환할 수 있는 경우에만 오버로드 해결에 참여합니다:

(C++26부터)
  • *lhs == *rhs
  • lhs.error() == rhs.error()
2) std::expected 객체를 std::unexpected 객체와 비교합니다. lhs가 unex.error()과 동일한 예상치 못한 값을 포함하는 경우에만 같습니다.

표현식 lhs.error() == unex.error()이 제대로 구성되지 않았거나 그 결과를 bool로 변환할 수 없는 경우 프로그램은 제대로 구성되지 않습니다.

(C++26까지)

이 오버로드는 표현식 lhs.error() == unex.error()이 제대로 구성되고 그 결과를 bool로 변환할 수 있는 경우에만 오버로드 해결에 참여합니다.

(C++26부터)
3) std::expected 객체를 예상 값과 비교합니다. lhs이 val과 동일한 예상 값을 포함하는 경우에만 같습니다.

표현식 *lhs == val이 제대로 구성되지 않았거나 그 결과를 bool로 변환할 수 없는 경우 프로그램은 제대로 구성되지 않습니다.

(C++26까지)

이 오버로드는 다음 모든 조건이 충족되는 경우에만 오버로드 해결에 참여합니다:

  • T2는 std::expected의 특수화가 아닙니다.
  • 표현식 *lhs == val이 제대로 구성되고 그 결과를 bool로 변환할 수 있습니다.
(C++26부터)
4) 두 std::expected 객체를 비교합니다. lhs와 rhs가 모두 예상 값을 나타내거나, 둘 다 동일한 예상치 못한 값을 포함하는 경우에만 같습니다.

표현식 lhs.error() == rhs.error()이 제대로 구성되지 않았거나 그 결과를 bool로 변환할 수 없는 경우 프로그램은 제대로 구성되지 않습니다.

(C++26까지)

이 오버로드는 표현식 lhs.error() == rhs.error()이 제대로 구성되고 그 결과를 bool로 변환할 수 있는 경우에만 오버로드 해결에 참여합니다.

(C++26부터)
5) std::expected 객체를 std::unexpected 객체와 비교합니다. lhs이 unex.error()과 동일한 예상치 못한 값을 포함하는 경우에만 같습니다.

표현식 lhs.error() == unex.error()이 제대로 구성되지 않았거나 그 결과를 bool로 변환할 수 없는 경우 프로그램은 제대로 구성되지 않습니다.

(C++26까지)

이 오버로드는 표현식 lhs.error() == unex.error()이 제대로 구성되고 그 결과를 bool로 변환할 수 있는 경우에만 오버로드 해결에 참여합니다.

(C++26부터)

이 함수들은 일반적인 비한정 또는 한정 조회에는 표시되지 않으며, 인자 종속 조회를 통해서만 찾을 수 있습니다. std::expected<T, E>가 인자의 연관된 클래스인 경우에만 가능합니다.

!= 연산자는 에서 합성operator==됩니다.

매개변수

lhs, rhs - std::expected 비교 대상 객체
unex - std::unexpected 와 비교할 값 lhs
val - 가 포함한 기대값과 비교할 값 lhs

반환값

1)
lhs. has_value ( ) ! = rhs. has_value ( ) ? false :
( lhs. has_value ( ) ? * lhs == * rhs : lhs. error ( ) == rhs. error ( ) )
2) ! lhs. has_value ( ) && static_cast < bool > ( lhs. error ( ) == unex. error ( ) )
3) lhs. has_value ( ) && static_cast < bool > ( * lhs == val )

4)
lhs. has_value ( ) ! = rhs. has_value ( ) ? false :
lhs. has_value ( ) || static_cast < bool > ( lhs. error ( ) == rhs. error ( ) )
5) ! lhs. has_value ( ) && static_cast < bool > ( lhs. error ( ) == unex. error ( ) )

예외

비교가 예외를 발생시킬 때와 무엇을 발생시키는지에 대해 설명합니다.

참고 사항

기능 테스트 매크로 값 표준 기능
__cpp_lib_constrained_equality 202411L (C++26) std::expected 에 대한 제약된 비교 연산자

예제

#include <expected>
#include <iostream>
#include <string_view>
using namespace std::string_view_literals;
int main()
{
    auto x1{"\N{GREEN HEART}"sv};
    auto x2{"\N{CROSS MARK}"sv};
    std::expected<std::string_view, int> e1{x1}, e2{x1}, e3{x2};
    std::unexpected u1{13};
    std::cout << "Overload (1):\n"
              << e1.value() << (e1 == e2 ? " == " : " != ") << *e2 << '\n'
              << e1.value() << (e1 != e3 ? " != " : " == ") << *e3 << "\n\n";
    std::cout << "Overload (2):\n"
              << e1.value() << (e1 == u1 ? " == " : " != ") << u1.error() << '\n';
    e1 = std::unexpected{13};
    std::cout << e1.error() << (e1 == u1 ? " == " : " != ") << u1.error() << '\n';
    e1 = std::unexpected{31};
    std::cout << e1.error() << (e1 != u1 ? " != " : " == ") << u1.error() << '\n';
    std::cout << "Overload (3):\n"
              << *e1 << (e1 == x1 ? " == " : " != ") << x1 << '\n'
              << *e1 << (e1 != x2 ? " != " : " == ") << x2 << "\n\n";
}

출력:

Overload (1):
💚 == 💚
💚 != ❌
Overload (2):
💚 != 13
13 == 13
31 != 13
Overload (3):
💚 == 💚
💚 != ❌

참고 항목

(C++23)
std::unexpected 객체들을 비교합니다
(함수 템플릿)