` C 20의 연산자? " />
기본값이 아닌 연산자 <=> 및 == 및 !=
C 20에서는 우주선 연산자 <=> ; 범용 비교 메커니즘을 제공합니다. 그러나 사용자 정의 3방향 비교 구현을 사용하면 이상한 동작이 발생합니다.
기본 구현에서는 == 및 !=
<=>의 기본 구현을 사용하여 다음 코드를 고려하세요.
struct X { int Dummy = 0; auto operator<=>(const X&) const = default; // Default implementation };
이 경우 코드는 성공적으로 컴파일되며 X 인스턴스를 비교하기 위해 == 및 != 사용을 허용합니다.
X a, b; a == b; // OK!
사용자 정의 구현 블록 == 및 !=
그러나 <=>의 사용자 정의 구현이 제공되는 경우:
struct X { int Dummy = 0; auto operator<=>(const X& other) const { return Dummy <=> other.Dummy; } };
오류가 발생한 결과 컴파일:
error C2676: binary '==': 'X' does not define this operator or a conversion to a type acceptable to the predefined operator
동작 이유
이 동작은 C 20 표준에 따라 의도된 것입니다.
클래스 정의가 == 연산자 함수를 명시적으로 선언하지 않지만 기본 3방향 비교 함수를 선언하는 경우 == 연산자 함수는 3방향 비교 연산자 함수와 동일한 액세스로 암시적으로 선언됩니다. .
기본적으로 <=> 연산자는 합성된 ==를 생성합니다. 이는 std::Vector와 같은 클래스가 기본값이 아닌 <=> 동일성 테스트의 경우 맞춤 구현보다 효율성이 떨어질 수 있습니다.
따라서 클래스에 맞춤 <=> 구현하는 경우 프로그래머는 올바른 비교 동작을 보장하기 위해 사용자 정의 == 구현도 제공해야 합니다.
위 내용은 C 20에서 사용자 정의 `<=>` 연산자와 함께 `==` 및 `!=`를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!