1. Vấn đề nó giải quyết
Số học chỉ số thường trộn số nguyên có dấu với std::size_t, còn mã số học đôi khi cần độ rộng trao đổi cụ thể. C++23 thêm suffix liên quan size và các typedef floating mở rộng tùy chọn.
2. Kiến thức cần có
Ngày 1: mức hỗ trợ triển khai và tính portable.
Ngày 9: suy luận kiểu bằng
auto.
3. Ý tưởng cốt lõi
uz tạo std::size_t; z tạo kiểu có dấu tương ứng. <stdfloat> đặt tên format floating độ rộng cố định được hỗ trợ, nhưng implementation không bắt buộc có mọi format. Hãy xác định giá trị đang được biến đổi rồi kiểm tra kiểu, lifetime hoặc quyền sở hữu kết quả. Bật C++23 chưa chắc thư viện đã triển khai đủ, vì vậy cần kiểm tra feature-test macro liên quan.
4. Cú pháp tối thiểu
auto count = 10uz;
auto offset = -1z;5. Cách nó hoạt động
Ví dụ tạo biểu thức hoặc đối tượng nhỏ nhất cho Literal suffix
z/uzvà extended floating-point type.Chương trình kiểm tra kiểu literal và báo có điều kiện một floating type độ rộng cố định.
Cuối cùng, nó in hoặc kiểm tra thông tin kích thước và kết quả khả dụng rõ ràng để dễ đối chiếu.
6. Lỗi thường gặp
Dùng
-1uzgây wrap trong kiểu unsigned; cho rằngstd::float32_tluôn tồn tại làm mã portable bị lỗi biên dịch.Không kiểm tra feature-test macro có thể chọn nhánh mã thư viện hiện tại chưa hỗ trợ.
7. Khi nào nên dùng
Nên dùng khi kích thước container, hiệu chỉ số và giao thức thật sự yêu cầu floating format được hỗ trợ.
Tránh dùng khi thêm suffix mà không kiểm tra dấu hoặc chọn extended float chỉ vì tên trông chính xác.
8. Ví dụ đơn giản
Chỉ số lùi dùng -1z để giữ kiểu có dấu liên quan size thay vì wrap thành unsigned. Chương trình dùng dữ liệu cố định để output dễ kiểm tra.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp23/20_size_suffixes_extended_floats/main.cpp
#include <cstddef>
#include <iostream>
#include <type_traits>
#if __has_include(<stdfloat>)
#include <stdfloat>
#endif
int main() {
auto count = 10uz;
auto offset = -1z;
static_assert(std::is_same_v<decltype(count), std::size_t>);
static_assert(std::is_same_v<decltype(offset),
std::make_signed_t<std::size_t>>);
std::cout << "count=" << count << " offset=" << offset << '\n';
#if defined(__STDCPP_FLOAT32_T__)
std::float32_t value = static_cast<std::float32_t>(1.5);
std::cout << "float32 bytes=" << sizeof(value) << '\n';
#else
std::cout << "float32 type unavailable\n";
#endif
}
9. Điều cần nhớ
Tách quy tắc chuẩn khỏi mức hỗ trợ thực tế.
Làm rõ lifetime, ownership và kiểu suy luận.
Ưu tiên cú pháp ngắn, đúng ý định.
Guard tính năng chưa được hỗ trợ đồng đều.
10. Câu hỏi tự kiểm tra
Dễ — Cú pháp ngắn nhất ở Phần 4 là gì và nhiệm vụ chính của nó là gì?
Trung bình — Đọc chương trình mẫu: giá trị, kiểu hoặc nhánh nào được quan sát, và vì sao?
Khó — So sánh kiểu và giá trị suy luận của
-1z,-1uzvàauto n = 1uz - 2uz; phép nào bị wrap?