> 백엔드 개발 > C++ > 본문

C 20에서 사용자 정의 `<=>` 연산자와 함께 `==` 및 `!=`를 사용할 수 없는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-07 21:11:03
원래의
986명이 탐색했습니다.

Why Can't I Use `==` and `!=` with a Custom `<=>` C 20의 연산자? 
` C 20의 연산자? " />

기본값이 아닌 연산자 <=> 및 == 및 !=

C 20에서는 우주선 연산자 <=> ; 범용 비교 메커니즘을 제공합니다. 그러나 사용자 정의 3방향 비교 구현을 사용하면 이상한 동작이 발생합니다.

기본 구현에서는 == 및 !=

<=>의 기본 구현을 사용하여 다음 코드를 고려하세요.

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp;) const = default; // Default implementation
};
로그인 후 복사

이 경우 코드는 성공적으로 컴파일되며 X 인스턴스를 비교하기 위해 == 및 != 사용을 허용합니다.

X a, b;

a == b; // OK!
로그인 후 복사

사용자 정의 구현 블록 == 및 !=

그러나 <=>의 사용자 정의 구현이 제공되는 경우:

struct X {
    int Dummy = 0;
    auto operator<=>(const X&amp; 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!