default_comparisons — 기본 비교 연산

default_comparisons — 기본 비교 연산 (Default comparisons)

**기본 비교 연산(defaulted comparison operator)**은 비교 연산자 함수를 명시적으로 = default로 지정해서, 컴파일러가 클래스에 대한 기본 비교를 생성하게 하는 기능이에요.

<=>(우주선 연산자), ==, !=, <, >, <=, >= 같은 비교 연산자를 기본화할 수 있어요. 클래스의 멤버를 순서대로 비교하는 동작을 컴파일러가 자동으로 생성해줘요.

출처: cppreference

본문

**기본화된 비교 연산자 함수(defaulted comparison operator function)**는 다음 모든 조건을 만족하는 비템플릿 비교 연산자 함수(즉 <=>, ==, !=, <, >, <=, >=)예요.

  • 어떤 클래스 C의 비정적 멤버이거나 friend이에요.
  • C에서, 또는 C가 완전한 타입인 문맥에서 = default로 정의돼요.
  • const C& 타입의 매개변수 두 개, 또는 C 타입의 매개변수 두 개를 가져요. 이때 (있다면) 묵시적 객체 매개변수가 첫 번째 매개변수로 간주돼요.

기본화된 비교를 생성할 때, 클래스 C에 대해 다음과 같은 순서로 **부분 객체 목록(subobject list)**이 만들져요.

  • C의 직접 기반 클래스 부분 객체, 선언 순서대로
  • C의 비정적 데이터 멤버, 선언 순서대로
    • 어떤 멤버 부분 객체가 배열 타입이면, 인덱스가 증가하는 순서의 원소 시퀀스로 확장돼요. 확장은 재귀적이에요. 배열 원소가 또 배열 타입이면 원소가 더 이상 없을 때까지 다시 확장돼요.
struct Point {
    int x, y;
    auto operator<=>(const Point&) const = default; // 멤버를 순서대로 비교
};

Point a{1, 2}, b{1, 3};
bool r = (a < b); // x 비교 후 같으면 y 비교

operator<=>를 기본화하면 <, <=, >, >=가 자동으로 파생돼요. ==를 기본화하면 !=가 파생돼요. 이렇게 되면 클래스마다 반복적인 비교 코드를 직접 쓰지 않아도 되고, 구조적으로 올바른 비교가 생성돼요.

더 알아보기 (Learn more)

cppreference