일 2017년 11월 11일 상기 ISO C ++위원회 채용 허브 서터 용의 제안 <=> "우주선"삼원 비교 연산자 에 추가 된 새로운 기능들 중 하나로서 20 ++ C . 일관성있는 비교 Sutter 라는 논문 에서 Maurer와 Brown은 새로운 디자인의 개념을 보여줍니다. 제안에 대한 개요는 다음 기사에서 발췌 한 내용입니다.
a <=> b 표현식 은 a <b 인 경우 <0 을 비교 하고 a> b 인 경우 > 0을 비교 하고 a와 b가 같거나 동등한 경우 == 0 을 비교하는 객체를 반환합니다 .
일반적인 경우 : 유형 X 와 Y 유형의 모든 비교를 작성 하고 멤버 별 의미를 쓰려면 다음과 같이 작성하십시오.
auto X::operator<=>(const Y&) =default;
고급 사례 : 당신의 유형에 대한 모든 비교 쓰려면 X 유형 Y 단지 쓰기, 운영자 <=> 소요 Y를 사용할 수 있습니다
= 기본을 원하는 경우 memberwise 의미를 얻기 위해, 반환 적절한 범주 유형 :
- 유형이 자연스럽게 <을 지원 하면 _ordering을 반환하면 대칭 < , > , <= , > = , == 및
! =을 . 그렇지 않으면 _equality를 반환하고 대칭 == 및 ! =을 효율적으로 생성 합니다.
- 타입 a == b 인 경우 strong_을 반환 합니다. 의미 F (A) == F (B) (대체 가능성, f는 공중 사용하여 액세스 할 경우에만 비교 - 돌출 상태를 읽어 CONST의 회원), 그렇지 않으면 반환
weak_ .
비교 카테고리
5 개의 비교 범주는 std::
유형 으로 정의되며 각각은 다음과 같은 사전 정의 된 값을 갖습니다.
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
이러한 유형 간의 암시 적 변환은 다음과 같이 정의됩니다.
strong_ordering
값 { less
, equal
, greater
}는 암시 적으로 변환 :
weak_ordering
값 { less
, equivalent
, greater
}
partial_ordering
값 { less
, equivalent
, greater
}
strong_equality
값이 {unequal
, equal
, unequal
}
weak_equality
값이 { nonequivalent
이고equivalent
, nonequivalent
}
weak_ordering
값이 {less
, equivalent
, greater
}는 암시 적으로 변환 :
partial_ordering
값이 {less
, equivalent
, greater
}
weak_equality
값이 { nonequivalent
이고equivalent
, nonequivalent
}
partial_ordering
값이 {less
, equivalent
, greater
, unordered
}는 암시 적으로 변환 :
weak_equality
값으로 { nonequivalent
, equivalent
,nonequivalent
, nonequivalent
}
strong_equality
값이 { equal
, unequal
} 인 경우 암시 적으로 다음으로 변환됩니다.
weak_equality
값이 { equivalent
이고nonequivalent
} 인
3 방향 비교
<=>
토큰이 도입된다. 문자 순서 <=>
는<= >
는 이전 소스 코드에서로 . 예를 들어, X<&Y::operator<=>
의미를 유지하려면 공백을 추가해야합니다.
과부하 연산자 <=>
는 3 방향 비교 기능이며보다 높고 <
낮습니다 <<
. 리터럴과 비교할 수있는 유형을 0
리턴하지만 표현식 템플리트를 지원하는 등 다른 리턴 유형이 허용됩니다. 모두<=>
언어와 표준 라이브러리에 정의 된 연산자는 위에서 언급 한 5 std::
가지 비교 범주 유형 중 하나를 반환 합니다.
언어 유형의 경우 다음과 같은 기본 <=>
제공 동일한 유형 비교가 제공됩니다. 달리 언급 된 경우를 제외하고 모두 constexpr 입니다. 스칼라 승격 / 변환을 사용하여 이러한 비교를 이기종으로 호출 할 수 없습니다.
- 를 들어
bool
, 통합 및 포인터 타입, <=>
반환 strong_ordering
.
- 포인터 유형의 경우, 다른 cv-qualifications와 파생 된 대 기본 변환은 동질적인 내장을 호출 할 수 있습니다.
<=>
있으며 내장 이기종이 operator<=>(T*, nullptr_t)
있습니다. 동일한 객체 / 할당에 대한 포인터 비교는 상수 표현식입니다.
- 기본 부동 소수점 유형의 경우
<=>
반환partial_ordering
하고 더 큰 부동 소수점 유형으로 인수를 확장하여 이기종으로 호출 할 수 있습니다.
- 열거 형의 경우,
<=>
열거 형의 기본 유형과 동일을 반환합니다.<=>
.
- 의 경우
nullptr_t
, <=>
반환 strong_ordering
항상 수율equal
.
- 복사 가능한 배열의 경우
T[N] <=> T[N]
와 동일한 유형 반환 T
의 <=>
및 수행 사전 편찬 elementwise 비교. 없습니다<=>
다른 배열 .
- 내용은
void
더 없다 <=>
.
이 작업자의 내부 작동을보다 잘 이해하려면 원본 용지 를 읽으십시오 . 이것은 내가 검색 엔진을 사용하여 찾은 것입니다.