Vào ngày 2017-11-11 , ủy ban ISO C ++ đã thông qua đề xuất của Herb Sutter cho toán tử so sánh ba chiều <=> "tàu vũ trụ" là một trong những tính năng mới được thêm vào C ++ 20 . Trong bài báo có tiêu đề So sánh nhất quán Sutter, Maurer và Brown trình bày các khái niệm của thiết kế mới. Để biết tổng quan về đề xuất, đây là một đoạn trích từ bài viết:
Biểu thức a <=> b trả về một đối tượng so sánh <0 nếu a <b , so sánh > 0 nếu a> b và so sánh == 0 nếu a và b bằng / tương đương.
Trường hợp phổ biến: Để viết tất cả các so sánh cho loại X của bạn với loại Y , với ngữ nghĩa thành viên, chỉ cần viết:
auto X::operator<=>(const Y&) =default;
Các trường hợp nâng cao: Để viết tất cả các so sánh cho loại X của bạn với loại Y , chỉ cần viết toán tử <=> lấy Y , có thể sử dụng
= mặc định để lấy ngữ nghĩa thành viên nếu muốn và trả về loại danh mục phù hợp:
- Trả về một _ordering nếu loại của bạn hỗ trợ một cách tự nhiên < và chúng tôi sẽ tạo đối xứng < , > , <= , > = , == , và
! = ; mặt khác trả về một _equality và chúng ta sẽ tạo đối xứng một cách hiệu quả == và ! = .
- Trả về strong_ nếu cho loại của bạn a == b ngụ ý f (a) == f (b) (khả năng thay thế, trong đó f chỉ đọc trạng thái so sánh có thể truy cập bằng cách sử dụng các thành viên const công khai ), nếu không thì trả về
yếu_ .
Danh mục so sánh
Năm loại so sánh được định nghĩa là std::
các loại, mỗi loại có các giá trị được xác định trước:
+--------------------------------------------------------------------+
| | Numeric values | Non-numeric |
| Category +-----------------------------------+ |
| | -1 | 0 | +1 | values |
+------------------+------+------------+---------------+-------------+
| strong_ordering | less | equal | greater | |
| weak_ordering | less | equivalent | greater | |
| partial_ordering | less | equivalent | greater | unordered |
| strong_equality | | equal | nonequal | |
| weak_equality | | equivalent | nonequivalent | |
+------------------+------+------------+---------------+-------------+
Chuyển đổi ngầm định giữa các loại này được xác định như sau:
strong_ordering
với các giá trị { less
, equal
, greater
} ngầm chuyển đổi thành:
weak_ordering
với các giá trị { less
, equivalent
, greater
}
partial_ordering
với các giá trị { less
, equivalent
, greater
}
strong_equality
với các giá trị { unequal
, equal
, unequal
}
weak_equality
với các giá trị { nonequivalent
, equivalent
, nonequivalent
}
weak_ordering
với các giá trị { less
, equivalent
, greater
} ngầm chuyển đổi thành:
partial_ordering
với các giá trị { less
, equivalent
, greater
}
weak_equality
với các giá trị { nonequivalent
, equivalent
, nonequivalent
}
partial_ordering
với các giá trị { less
, equivalent
, greater
, unordered
} ngầm chuyển đổi thành:
weak_equality
với các giá trị { nonequivalent
, equivalent
, nonequivalent
, nonequivalent
}
strong_equality
với các giá trị { equal
, unequal
} hoàn toàn chuyển đổi thành:
weak_equality
với các giá trị { equivalent
, nonequivalent
}
So sánh ba chiều
Mã <=>
thông báo được giới thiệu. Chuỗi ký tự <=>
mã hóa <= >
, trong mã nguồn cũ. Ví dụ, X<&Y::operator<=>
cần thêm một khoảng trắng để giữ lại ý nghĩa của nó.
Toán tử quá tải <=>
là một hàm so sánh ba chiều và có độ ưu tiên cao hơn <
và thấp hơn <<
. Nó trả về một loại có thể được so sánh với nghĩa đen 0
nhưng các loại trả về khác được cho phép như để hỗ trợ các mẫu biểu thức. Tất cả các <=>
toán tử được xác định trong ngôn ngữ và trong thư viện chuẩn trả về một trong 5 std::
loại danh mục so sánh đã nói ở trên .
Đối với các loại ngôn ngữ, các <=>
so sánh cùng loại tích hợp sau được cung cấp. Tất cả đều là constexpr , trừ khi có ghi chú khác. Những so sánh này không thể được gọi một cách không đồng nhất bằng cách sử dụng các chương trình khuyến mãi / chuyển đổi vô hướng.
- Đối với
bool
, tích phân và các loại con trỏ, <=>
trả về strong_ordering
.
- Đối với các loại con trỏ, các trình độ cv khác nhau và các chuyển đổi xuất phát từ cơ sở được phép gọi một tích hợp đồng nhất
<=>
và có tích hợp không đồng nhất operator<=>(T*, nullptr_t)
. Chỉ so sánh các con trỏ với cùng một đối tượng / phân bổ là các biểu thức không đổi.
- Đối với các loại dấu phẩy động cơ bản,
<=>
trả về partial_ordering
và có thể được gọi một cách không đồng nhất bằng cách mở rộng các đối số thành một loại dấu phẩy động lớn hơn.
- Đối với bảng liệt kê,
<=>
trả về giống như kiểu cơ bản của kiểu liệt kê <=>
.
- Cho
nullptr_t
, <=>
trả lại strong_ordering
và luôn luôn mang lại equal
.
- Đối với các mảng có thể sao chép,
T[N] <=> T[N]
trả về cùng loại với T
's <=>
và thực hiện so sánh theo nguyên tố từ điển. Không có <=>
cho các mảng khác.
- Vì
void
không có <=>
.
Để hiểu rõ hơn về hoạt động bên trong của nhà điều hành này, xin vui lòng đọc bài báo gốc . Đây chỉ là những gì tôi đã tìm ra bằng cách sử dụng các công cụ tìm kiếm.