1. Vấn đề nó giải quyết
Three-way comparison tạo một kết quả ordering có thể hỗ trợ nhiều toán tử quan hệ và giữ thông tin thứ tự strong, weak hay partial. Nó làm một giả định quan trọng trở nên rõ và có thể kiểm tra.
2. Kiến thức cần có
Toán tử so sánh, class và suy luận kiểu.
Bạn cần biết biên dịch chương trình ngắn và đọc output.
3. Ý tưởng cốt lõi
Thay vì hỏi sáu câu đúng/sai riêng, <=> trả về chiếc la bàn chỉ nhỏ hơn, bằng, lớn hơn hoặc unordered nếu category cho phép. Hãy đọc operator<=> như lời hứa chính xác; runtime precondition vẫn do lập trình viên chịu trách nhiệm.
4. Cú pháp tối thiểu
auto operator<=>(const Measurement&) const = default;5. Cách nó hoạt động
Chương trình đưa vào dạng nhỏ nhất cần thiết của
operator<=>.Nó áp dụng tính năng lên dữ liệu cố định và giữ owner cần thiết trong scope.
Nó in một kết quả để đối chiếu trực tiếp với source.
6. Lỗi thường gặp
Member số thực thường tạo
std::partial_orderingvì NaN có thể unordered; giả định strong ordering có thể phá kỳ vọng của sorted container.Hãy kiểm tra cả header, mức hỗ trợ thư viện C++20, lifetime và kiểu được suy luận.
7. Khi nào nên dùng
Nên dùng khi kiểu có thứ tự nhất quán và cần sinh các phép quan hệ đồng bộ.
Tránh dùng khi miền bài toán không có thứ tự toàn phần hoặc bán phần có ý nghĩa.
8. Ví dụ đơn giản
Một measurement có member double dùng spaceship mặc định và bộc lộ category partial ordering. Tệp .cpp không nhận input nên kết quả dễ lặp lại.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp20/19_three_way_comparison_categories/main.cpp
// Day 19: Three-Way Comparison and Comparison Categories
#include <compare>
#include <iostream>
#include <type_traits>
struct Measurement {
double value{};
auto operator<=>(const Measurement&) const = default;
};
int main() {
Measurement first{2.5};
Measurement second{3.0};
using Order = decltype(first <=> second);
static_assert(std::is_same_v<Order, std::partial_ordering>);
std::cout << std::boolalpha << (first < second) << '\n';
}
9. Điều cần nhớ
operator<=>diễn đạt ý tưởng C++20 trung tâm của ngày này.Ví dụ cô lập một hành vi bằng dữ liệu cố định.
Compiler check không thay thế suy luận về lifetime và runtime.
Ưu tiên interface nhỏ nhất nói đúng yêu cầu thật.
10. Câu hỏi tự kiểm tra
Dễ — Nhiệm vụ chính của
operator<=>trong ví dụ tối thiểu là gì?Trung bình — Kết quả Boolean nào được in khi so measurement
2.5với3.0?Khó — Vì sao comparison mặc định chứa
doublethường không suy luận thànhstd::strong_ordering?