operator==,!=,<,<=,>,>=,<=> (std::tuple)
|
헤더에 정의됨
<tuple>
|
||
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
==
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(1) |
(C++11 이후)
(C++14 이후 constexpr) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
!
=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(2) |
(C++11부터)
(C++14부터 constexpr) (C++20까지) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
<
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(3) |
(C++11부터)
(C++14부터 constexpr) (C++20까지) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
<=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(4) |
(C++11부터)
(C++14부터 constexpr) (C++20까지) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
>
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(5) |
(C++11부터)
(C++14부터 constexpr) (C++20까지) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
bool
operator
>=
(
const
std::
tuple
<
TTypes...
>
&
lhs,
|
(6) |
(C++11부터)
(C++14부터 constexpr) (C++20까지) |
|
template
<
class
...
TTypes
,
class
...
UTypes
>
constexpr
std::
common_comparison_category_t
<
|
(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
<
|
(9) | (C++23 이후) |
|
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 이후) |
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
;
...
- 빈 튜플의 경우 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
)
)
;
`, `
`, `
tuple-like
객체이며,
rhs
의 요소 개수가
std::
tuple_size_v
<
UTuple
>
에 의해 결정된다는 점이 다릅니다. 이 오버로드는
인수 의존적 탐색
을 통해서만 찾을 수 있습니다.
tuple-like
객체인 경우입니다.
/* Elems */
는 증가하는 순서로 각
i
에 대해
[
0
,
std::
tuple_size_v
<
UTuple
>
)
범위 내의
std::
tuple_element_t
<
i, UTuple
>
타입들의 팩을 나타냅니다. 이 오버로드는
인수 의존적 탐색
을 통해서만 찾을 수 있습니다.
모든 비교 연산자는 단락 평가됩니다; 비교 결과를 결정하는 데 필요한 것 이상으로 튜플 요소에 접근하지 않습니다.
|
|
(C++20부터) |
목차 |
매개변수
| lhs, rhs | - | 비교할 튜플 |
반환값
[
0
,
sizeof...
(
Types
)
)
범위의 모든
i
에 대해 참일 경우. 그렇지 않으면
false
를 반환합니다. 두 개의 빈 튜플에 대해서는
true
를 반환합니다.
참고 사항
|
관계 연산자는 각 요소의 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
의 값을 사전식으로 비교합니다
(함수 템플릿) |