일 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더 없다 <=>.
이 작업자의 내부 작동을보다 잘 이해하려면 원본 용지 를 읽으십시오 . 이것은 내가 검색 엔진을 사용하여 찾은 것입니다.