기본값 아님 <=> 연산자와 == 및 !=의 부재
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& other) const { return Dummy <=> other.Dummy; } };
이제 코드가 컴파일에 실패하고 == 연산자가 클래스 X에 대해 정의되지 않았다는 오류가 표시됩니다. 수정된 우주선 연산자는 기본값이 아니며 컴파일러는 == 연산자를 자동으로 생성하지 않습니다. 이 경우 사용자는 사용자 정의 클래스의 비교 요구 사항을 해결하기 위해 == 연산자를 명시적으로 정의해야 합니다.
위 내용은 사용자 정의 `우주선` 연산자가 C 20에서 `==` 및 `!=` 연산자를 생성하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!