Namespaces
Variants

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

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)



 
 
헤더 <optional>
에 정의됨optional두 개의
template< class T, class U >
constexpr bool operator==( const optional<T>& lhs, const optional<U>& rhs );
객체 비교 (1)
template< class T, class U >
constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (2)
template< class T, class U >
constexpr bool operator<( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (3)
template< class T, class U >
constexpr bool operator<=( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (4)
template< class T, class U >
constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (5)
template< class T, class U >
constexpr bool operator>=( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (6)
template< class T, std::three_way_comparable_with<T> U >
constexpr std::compare_three_way_result_t<T, U>
    operator<=>( const optional<T>& lhs, const optional<U>& rhs );
(C++17부터) (7)
(C++20부터)optionalnullopt
template< class T >
constexpr bool operator==( const optional<T>& opt, std::nullopt_t ) noexcept;
와 객체 비교
template< class T >
constexpr bool operator==( std::nullopt_t, const optional<T>& opt ) noexcept;
(8) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator!=( const optional<T>& opt, std::nullopt_t ) noexcept;
(9) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator!=( std::nullopt_t, const optional<T>& opt ) noexcept;
(10) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator<( const optional<T>& opt, std::nullopt_t ) noexcept;
(11) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator<( std::nullopt_t, const optional<T>& opt ) noexcept;
(12) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator<=( const optional<T>& opt, std::nullopt_t ) noexcept;
(13) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator<=( std::nullopt_t, const optional<T>& opt ) noexcept;
(14) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator>( const optional<T>& opt, std::nullopt_t ) noexcept;
(15) (C++17부터)
(C++20까지)
template< class T >
constexpr bool operator>( std::nullopt_t, const optional<T>& opt ) noexcept;
(16) (C++17부터)
(C++20까지)
template< class T > 
constexpr bool operator>=( const optional<T>& opt, std::nullopt_t ) noexcept;
(17) (C++17부터)
(C++20까지)
template< class T > 
constexpr bool operator>=( std::nullopt_t, const optional<T>& opt ) noexcept;
(18) (C++17부터)
(C++20까지)
template< class T >
constexpr std::strong_ordering
    operator<=>( const optional<T>& opt, std::nullopt_t ) noexcept;
(19) (C++20부터)
optional 객체를 값과 비교
template< class T, class U >
constexpr bool operator==( const optional<T>& opt, const U& value );
(21) (C++17부터)
template< class U, class T >
constexpr bool operator==( const U& value, const optional<T>& opt );
(22) (C++17부터)
template< class T, class U >
constexpr bool operator!=( const optional<T>& opt, const U& value );
(23) (C++17부터)
template< class U, class T >
constexpr bool operator!=( const U& value, const optional<T>& opt );
(24) (C++17부터)
template< class T, class U >
constexpr bool operator<( const optional<T>& opt, const U& value );
(25) (C++17부터)
template< class U, class T >
constexpr bool operator<( const U& value, const optional<T>& opt );
(26) (C++17부터)
template< class T, class U >
constexpr bool operator<=( const optional<T>& opt, const U& value );
(27) (C++17부터)
template< class U, class T >
constexpr bool operator<=( const U& value, const optional<T>& opt );
(28) (C++17부터)
template< class T, class U >
constexpr bool operator>( const optional<T>& opt, const U& value );
(29) (C++17부터)
template< class U, class T >
constexpr bool operator>( const U& value, const optional<T>& opt );
(30) (C++17부터)
template< class T, class U >
constexpr bool operator>=( const optional<T>& opt, const U& value );
(31) (C++17부터)
template< class U, class T >
constexpr bool operator>=( const U& value, const optional<T>& opt );
(32) (C++17부터)
template< class T, std::three_way_comparable_with<T> U >
constexpr std::compare_three_way_result_t<T, U>
    operator<=>( const optional<T>& opt, const U& value );
(33) (C++20부터)

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

1-7) 두 개의 optional 객체, lhs와 rhs를 비교합니다. T과 lhs 둘 다 값을 포함하는 경우에만 포함된 값을 비교합니다(해당 rhs의 연산자 사용). 그렇지 않으면
  • lhs는 rhs와 lhs 둘 다 값을 포함하지 않는 경우에만 같음rhs으로 간주됩니다.
  • lhs는 rhs가 값을 포함하고 rhs가 값을 포함하지 않는 경우에만 작음lhs으로 간주됩니다.
1-6) @이 해당 비교 연산자를 나타낸다고 할 때, 각 함수에 대해:

해당 표현식 *lhs @ *rhs이 잘못된 형식이거나 그 결과를 bool로 변환할 수 없는 경우, 프로그램은 잘못된 형식입니다.

(C++26까지)

이 오버로드는 해당 표현식 *lhs @ *rhs이 잘 형식화되고 그 결과를 bool로 변환할 수 있는 경우에만 오버로드 해결에 참여합니다.

(C++26부터)
8-20) opt를 nullopt과 비교합니다. 값을 포함하지 않는 와 비교할 때는 (1-6)와 동일합니다. optional

, <, <=, >, >= 및 != 연산자는 각각 와 에서 operator<=>합성operator==됩니다.

(C++20부터)
21-33) opt를 value과 비교합니다. T가 값을 포함하는 경우에만 값을 비교합니다(해당 opt의 연산자 사용). 그렇지 않으면 opt는 보다 작음 value으로 간주됩니다.
21-32) @이 해당 비교 연산자를 나타낸다고 할 때, 각 함수에 대해:

해당 표현식 *opt @ value 또는 value @ *opt(피연산자의 위치에 따라 다름)가 잘못된 형식이거나 그 결과를 bool로 변환할 수 없는 경우, 프로그램은 잘못된 형식입니다.

(C++26까지)

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

  • U은 std::optional의 특수화가 아닙니다.
  • 해당 표현식 *opt @ value 또는 value @ *opt(피연산자의 위치에 따라 다름)이 잘 형식화되고 그 결과를 bool로 변환할 수 있습니다.
(C++26부터)

매개변수

lhs, rhs, opt - 비교할 optional 객체
value - 포함된 값과 비교할 값

반환값

1) lhs. has_value ( ) ! = rhs. has_value ( ) ? false :
( lhs. has_value ( ) == false ? true : * lhs == * rhs )
2) lhs. has_value ( ) ! = rhs. has_value ( ) ? true :
( lhs. has_value ( ) == false ? false : * lhs ! = * rhs )
3) ! rhs ? false : ( ! lhs ? true : * lhs < * rhs )
4) ! lhs ? true : ( ! rhs ? false : * lhs <= * rhs )
5) ! lhs ? false : ( ! rhs ? true : * lhs > * rhs )
6) ! rhs ? true : ( ! lhs ? false : * lhs >= * rhs )
7) lhs && rhs ? * lhs <=> * rhs : lhs. has_value ( ) <=> rhs. has_value ( )
8,9) ! opt
10,11) opt. has_value ( )
12) false
13) opt. has_value ( )
14) ! opt
15) true
16) opt. has_value ( )
17) false
18) true
19) ! opt
20) opt. has_value ( ) <=> false
21) opt. has_value ( ) ? * opt == value : false
22) opt. has_value ( ) ? value == * opt : false
23) opt. has_value ( ) ? * opt ! = value : true
24) opt. has_value ( ) ? value ! = * opt : true
25) opt. has_value ( ) ? * opt < value : true
26) opt. has_value ( ) ? value < * opt : false
27) opt. has_value ( ) ? * opt <= value : true
28) opt. has_value ( ) ? value <= * opt : false
29) opt. has_value ( ) ? * opt > value : false
30) opt. has_value ( ) ? value > * opt : true
31) opt. has_value ( ) ? * opt >= value : false
32) opt. has_value ( ) ? value >= * opt : true
33) opt. has_value ( ) ? * opt <=> value : std :: strong_ordering :: less

예외

1-7) 구현 정의 예외를 발생시킬 수 있습니다.
21-33) 비교가 예외를 발생시킬 때와 무엇을 발생시키는지 설명합니다.

참고 사항

기능 테스트 매크로 값 표준 기능
__cpp_lib_constrained_equality 202403L (C++26) 제약된 비교 연산자 for std::optional

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2945 C++17 T-비교 케이스에서 템플릿 매개변수 순서가 일관되지 않음 일관성 있게 수정됨