Namespaces
Variants

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

From cppreference.net
Utilities library
헤더에 정의됨 <tuple>
template < class ... TTypes , class ... UTypes >

bool operator == ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(1) (C++11 이후)
(C++14 이후 constexpr)
template < class ... TTypes , class ... UTypes >

bool operator ! = ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(2) (C++11부터)
(C++14부터 constexpr)
(C++20까지)
template < class ... TTypes , class ... UTypes >

bool operator < ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(3) (C++11부터)
(C++14부터 constexpr)
(C++20까지)
template < class ... TTypes , class ... UTypes >

bool operator <= ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(4) (C++11부터)
(C++14부터 constexpr)
(C++20까지)
template < class ... TTypes , class ... UTypes >

bool operator > ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(5) (C++11부터)
(C++14부터 constexpr)
(C++20까지)
template < class ... TTypes , class ... UTypes >

bool operator >= ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(6) (C++11부터)
(C++14부터 constexpr)
(C++20까지)
template < class ... TTypes , class ... UTypes >

constexpr std:: common_comparison_category_t <
synth - three - way - result < TTypes, Elems > ... >
operator <=> ( const std:: tuple < TTypes... > & lhs,

const std:: tuple < UTypes... > & rhs ) ;
(7) (C++20 이후)
template < class ... TTypes , tuple - like UTuple >
constexpr bool operator == ( const tuple < TTypes... > & lhs, const UTuple & rhs ) ;
(8) (C++23 이후)
template < class ... TTypes , tuple - like UTuple >

constexpr std:: common_comparison_category_t <
synth - three - way - result < TTypes, /* Elems */ > ... >

operator <=> ( const tuple < TTypes... > & lhs, const UTuple & rhs ) ;
(9) (C++23 이후)
1,2) 튜플의 모든 요소를 lhs 와 튜플의 해당 요소 rhs operator == 로 비교합니다.
1) 모든 쌍에 해당하는 요소들이 동일하면 true 를 반환합니다.
2) 반환값 ! ( lhs == rhs ) .
sizeof... ( TTypes ) sizeof... ( UTypes ) 와 같지 않거나, std :: get < i > ( lhs ) == std :: get < i > ( rhs ) [ 0 , sizeof... ( Types ) ) 범위 내의 어떤 i 에 대해서도 유효한 표현식이 아닌 경우, 프로그램의 형식이 올바르지 않습니다.
std :: get < i > ( lhs ) == std :: get < i > ( rhs ) 의 타입과 값 범주가 [ 0 , sizeof... ( Types ) ) 범위 내의 어떤 i 에 대해서도 BooleanTestable 요구 사항을 충족하지 않는 경우, 동작은 정의되지 않습니다.
(C++26 이전)
이 오버로드는 sizeof... ( TTypes ) sizeof... ( UTypes ) 와 같고, std :: get < i > ( lhs ) == std :: get < i > ( rhs ) 가 유효한 표현식이며, decltype ( std :: get < i > ( lhs ) == std :: get < i > ( rhs ) ) [ 0 , sizeof... ( Types ) ) 범위 내의 모든 i 에 대해 boolean-testable 을 모델로 하는 경우에만 오버로드 해결에 참여합니다.
(C++26 이후)
3-6) lhs rhs operator < 를 사용하여 사전식으로 비교합니다. 즉, 첫 번째 요소들을 비교하고, 동등할 경우 두 번째 요소들을 비교하며, 그것들도 동등할 경우 세 번째 요소들을 비교하는 방식으로 진행됩니다.
3) 빈 튜플의 경우 false 를 반환합니다. 비어 있지 않은 튜플의 경우, 그 효과는 다음과 동등합니다:
if ( std :: get < 0 > ( lhs ) < std :: get < 0 > ( rhs ) ) return true ;

if ( std :: get < 0 > ( rhs ) < std :: get < 0 > ( lhs ) ) return false ;
if ( std :: get < 1 > ( lhs ) < std :: get < 1 > ( rhs ) ) return true ;
if ( std :: get < 1 > ( rhs ) < std :: get < 1 > ( lhs ) ) return false ;
...

return std :: get < N - 1 > ( lhs ) < std :: get < N - 1 > ( rhs ) ;
4) 반환값 ! ( rhs < lhs ) .
5) 반환값 rhs < lhs .
6) 반환값 ! ( lhs < rhs ) .
만약 sizeof... ( TTypes ) sizeof... ( UTypes ) 와 같지 않거나, equivalent-to 문에 표시된 비교 표현식 중 하나가 유효한 표현식이 아닌 경우, 프로그램은 ill-formed입니다.
동등 비교 표현식에 표시된 비교 표현식의 타입과 값 범주 중 어느 하나라도 BooleanTestable 요구 사항을 충족하지 않을 경우, 동작은 정의되지 않습니다.
7) lhs rhs synth-three-way 를 사용하여 사전식으로 비교합니다. 즉, 첫 번째 요소를 비교하고, 동등할 경우 두 번째 요소를 비교하며, 그것들도 동등할 경우 세 번째 요소를 비교하는 방식으로 진행됩니다.
  • 빈 튜플의 경우 std::strong_ordering::equal 을 반환합니다.
  • 비어 있지 않은 튜플의 경우, 효과는 다음과 동일합니다

if ( auto c = synth-three-way ( std :: get < 0 > ( lhs ) , std :: get < 0 > ( rhs ) ) ; c ! = 0 ) return c ;
if ( auto c = synth-three-way ( std :: get < 1 > ( lhs ) , std :: get < 1 > ( rhs ) ) ; c ! = 0 ) return c ;
...
return synth-three-way ( std :: get < N - 1 > ( lhs ) , std :: get < N - 1 > ( rhs ) ) ;

**번역 참고사항:** - C++ 코드 내의 모든 키워드, 식별자, 문법 요소는 원본 그대로 유지했습니다 - HTML 태그와 속성은 번역하지 않았습니다 - ` `, `
`, `` 태그 내부의 텍스트는 번역에서 제외했습니다
- C++ 관련 용어(if, auto, return, std::get 등)는 번역하지 않았습니다
- 코드 구조와 형식은 완전히 보존되었습니다
8) (1) 과 동일하지만, rhs tuple-like 객체이며, rhs 의 요소 개수가 std:: tuple_size_v < UTuple > 에 의해 결정된다는 점이 다릅니다. 이 오버로드는 인수 의존적 탐색 을 통해서만 찾을 수 있습니다.
9) (7) 과 동일하지만, rhs tuple-like 객체인 경우입니다. /* Elems */ 는 증가하는 순서로 각 i 에 대해 [ 0 , std:: tuple_size_v < UTuple > ) 범위 내의 std:: tuple_element_t < i, UTuple > 타입들의 팩을 나타냅니다. 이 오버로드는 인수 의존적 탐색 을 통해서만 찾을 수 있습니다.

모든 비교 연산자는 단락 평가됩니다; 비교 결과를 결정하는 데 필요한 것 이상으로 튜플 요소에 접근하지 않습니다.

< , <= , > , >= , 그리고 != 연산자들은 각각 operator <=> operator == 로부터 합성됩니다 .

(C++20부터)

목차

매개변수

lhs, rhs - 비교할 튜플

반환값

1,8) true 를 반환합니다, 만약 std :: get < i > ( lhs ) == std :: get < i > ( rhs ) [ 0 , sizeof... ( Types ) ) 범위의 모든 i 에 대해 참일 경우. 그렇지 않으면 false 를 반환합니다. 두 개의 빈 튜플에 대해서는 true 를 반환합니다.
2) ! ( lhs == rhs )
3) true 를 반환하는 경우는 lhs 에서 첫 번째로 동등하지 않은 요소가 rhs 의 해당 요소보다 작을 때이며, false 를 반환하는 경우는 rhs 에서 첫 번째로 동등하지 않은 요소가 lhs 의 해당 요소보다 작을 때이거나 동등하지 않은 요소가 존재하지 않을 때입니다. 두 개의 빈 튜플에 대해서는 false 를 반환합니다.
4) ! ( rhs < lhs )
5) rhs < lhs
6) ! ( lhs < rhs )
7,9) 첫 번째 쌍의 비동등 요소 간의 관계(존재하는 경우), 그렇지 않으면 std::strong_ordering::equal 을 반환합니다. 두 개의 빈 튜플에 대해서는 std::strong_ordering::equal 을 반환합니다.

참고 사항

관계 연산자는 각 요소의 operator < 를 기반으로 정의됩니다.

(C++20까지)

관계 연산자는 synth-three-way 를 기반으로 정의되며, 이는 가능한 경우 operator <=> 를 사용하고, 그렇지 않으면 operator < 를 사용합니다.

특히, 요소 타입 자체가 operator <=> 를 제공하지 않지만, three-way 비교 가능 타입으로 암시적으로 변환 가능한 경우, operator < 대신 해당 변환이 사용됩니다.

(C++20부터)
기능 테스트 매크로 표준 기능
__cpp_lib_constrained_equality 202403L (C++26) 제약된 operator == for std::tuple

예제

튜플에 대해 operator < 가 정의되어 있으므로, 튜플의 컨테이너를 정렬할 수 있습니다.

#include <algorithm>
#include <iostream>
#include <tuple>
#include <vector>
int main()
{
    std::vector<std::tuple<int, std::string, float>> v
    {
        {2, "baz", -0.1},
        {2, "bar", 3.14},
        {1, "foo", 10.1},
        {2, "baz", -1.1},
    };
    std::sort(v.begin(), v.end());
    for (const auto& p: v)
        std::cout << "{ " << get<0>(p)
                  << ", " << get<1>(p)
                  << ", " << get<2>(p)
                  << " }\n";
}

출력:

{ 1, foo, 10.1 }
{ 2, bar, 3.14 }
{ 2, baz, -1.1 }
{ 2, baz, -0.1 }

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 2114
( P2167R3 )
C++11 불린 연산에 대한 타입 사전 조건이 누락됨 추가됨

참고 항목

(C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20에서 제거됨) (C++20)
pair 의 값을 사전식으로 비교합니다
(함수 템플릿)