>  기사  >  백엔드 개발  >  사용자 정의 `우주선` 연산자가 C 20에서 `==` 및 `!=` 연산자를 생성하지 않는 이유는 무엇입니까?

사용자 정의 `우주선` 연산자가 C 20에서 `==` 및 `!=` 연산자를 생성하지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-07 05:35:02294검색

Why Doesn't a Custom `spaceship` Operator Generate `==` and `!=` Operators in C  20?

기본값 아님 <=> 연산자와 == 및 !=의 부재

C 20에서 새로 도입된 우주선 연산자(<=>)는 == 및 != 연산자 생성과 관련하여 예상치 못한 동작을 유발했습니다. . 사용자 정의 구현과 함께 기본값이 아닌 우주선 연산자를 사용할 때 사용자는 컴파일 오류에 직면할 수 있습니다.

기본적으로 우주선 연산자는 지정된 유형의 두 개체를 비교합니다. 클래스가 == 연산자를 명시적으로 정의하지 않지만 기본값이 아닌 기본 우주선 연산자를 정의하는 경우 컴파일러는 우주선 연산자와 동일한 액세스 권한을 가진 == 연산자를 자동으로 생성합니다. 언어 표준 [class.compare.default]에 지정된 이 동작은 std::Vector와 같은 클래스가 동등성 테스트에 기본값이 아닌 우주선 연산자를 사용하지 않도록 보장합니다.

그러나 우주선 연산자가 그렇지 않은 경우 기본값으로 설정되면(즉, 사용자 정의 구현이 있음) 컴파일러는 == 연산자를 생성하지 않습니다. 이는 사용자 지정 우주선 연산자를 정의하는 클래스에서 특정 비교 시나리오를 처리하기 위해 ==에 대한 특수 구현이 필요할 수 있기 때문입니다. 따라서 언어는 필요한 경우 == 연산자를 명시적으로 정의하는 것을 프로그래머에게 맡깁니다.

예를 들어 다음 코드를 고려해보세요.

#include <compare>

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&) const = default; // Default implementation
};

이 코드는 우주선이 성공적으로 컴파일되기 때문에 연산자가 기본값으로 지정되고 컴파일러는 == 연산자를 생성합니다. 그러나 우주선 연산자를 사용자 정의 구현으로 변경하면

struct X
{
    int Dummy = 0;
    auto operator<=>(const X&amp; other) const
    {
        return Dummy <=> other.Dummy;
    }
};

이제 코드가 컴파일에 실패하고 == 연산자가 클래스 X에 대해 정의되지 않았다는 오류가 표시됩니다. 수정된 우주선 연산자는 기본값이 아니며 컴파일러는 == 연산자를 자동으로 생성하지 않습니다. 이 경우 사용자는 사용자 정의 클래스의 비교 요구 사항을 해결하기 위해 == 연산자를 명시적으로 정의해야 합니다.

위 내용은 사용자 정의 `우주선` 연산자가 C 20에서 `==` 및 `!=` 연산자를 생성하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.