Bạn có thể làm mà không có tiêu đề:
using size_t = decltype(sizeof(int));
using size_t = decltype(sizeof 1); // The shortest is my favourite.
using size_t = decltype(sizeof "anything");
Điều này là do tiêu chuẩn C ++ yêu cầu:
Kết quả của sizeofvà sizeof...là một hằng số kiểu std::size_t. [Lưu ý: std::size_tđược định nghĩa trong tiêu đề chuẩn <cstddef>(18.2). - ghi chú cuối]
Nói cách khác, tiêu chuẩn yêu cầu:
static_assert(std::is_same<decltype(sizeof(int)), std::size_t>::value,
"This never fails.");
Cũng lưu ý rằng việc typedefkhai báo này trong toàn cục và trong stdkhông gian tên là hoàn toàn ổn , miễn là nó khớp với tất cả các typedefkhai báo khác của cùng một typedef-name (lỗi trình biên dịch được đưa ra trên các khai báo không khớp).
Điều này là do:
§7.1.3.1 Tên typedef không giới thiệu kiểu mới như cách khai báo lớp (9.1) hoặc khai báo enum.
§7.1.3.3 Trong một phạm vi phi lớp nhất định, một bộ typedefxác định có thể được sử dụng để xác định lại tên của bất kỳ kiểu nào được khai báo trong phạm vi đó để tham chiếu đến kiểu mà nó đã tham chiếu đến.
Đối với những người hoài nghi nói rằng điều này tạo thành một sự bổ sung của một kiểu mới vào không gian tên std , và một hành động như vậy bị nghiêm cấm rõ ràng theo tiêu chuẩn, và đây là UB và đó là tất cả những gì ở đó; Tôi phải nói rằng thái độ này dẫn đến việc phớt lờ và phủ nhận sự hiểu biết sâu sắc hơn về các vấn đề cơ bản.
Tiêu chuẩn cấm thêm các khai báo và định nghĩa mới vào không gian tên stdbởi vì làm như vậy người dùng có thể làm xáo trộn thư viện tiêu chuẩn và làm mất toàn bộ chân của họ. Đối với những người viết tiêu chuẩn, dễ dàng hơn để cho phép người dùng chuyên môn hóa một vài thứ cụ thể và cấm làm bất cứ điều gì khác để có biện pháp tốt, hơn là cấm mọi thứ mà người dùng không nên làm và có nguy cơ bỏ lỡ điều gì đó quan trọng (và điều đó). Trước đây họ đã làm điều đó khi yêu cầu rằng không có thùng chứa tiêu chuẩn nào được khởi tạo với loại không hoàn chỉnh, trong khi trên thực tế, một số thùng chứa cũng có thể làm được (xem Thư viện tiêu chuẩn: Các thùng chứa loại không đầy đủ của Matthew H. Austern ):
... Cuối cùng, tất cả dường như quá âm u và quá kém hiểu biết; ủy ban tiêu chuẩn hóa không cho rằng có bất kỳ sự lựa chọn nào ngoại trừ việc nói rằng các thùng chứa STL không được cho là hoạt động với các loại không hoàn chỉnh. Để có biện pháp tốt, chúng tôi cũng đã áp dụng lệnh cấm đó cho phần còn lại của thư viện tiêu chuẩn.
... Nhìn lại, bây giờ công nghệ đã được hiểu rõ hơn, quyết định đó về cơ bản vẫn có vẻ đúng. Có, trong một số trường hợp, có thể triển khai một số vùng chứa tiêu chuẩn để chúng có thể được khởi tạo với các loại không hoàn chỉnh - nhưng cũng rõ ràng rằng trong các trường hợp khác, điều đó sẽ khó hoặc không thể. Phần lớn cơ hội là bài kiểm tra đầu tiên chúng tôi đã thử, sử dụng std::vector, tình cờ là một trong những trường hợp dễ dàng.
Cho rằng các quy tắc ngôn ngữ yêu cầu std::size_tphải chính xác decltype(sizeof(int)), làm namespace std { using size_t = decltype(sizeof(int)); }là một trong những điều không vi phạm bất cứ điều gì.
Trước C ++ 11, không có decltypevà do đó không có cách nào để khai báo kiểu sizeofkết quả trong một câu lệnh đơn giản mà không có nhiều mẫu liên quan. size_tcác kiểu bí danh khác nhau trên các kiến trúc đích khác nhau, tuy nhiên, sẽ không phải là một giải pháp thanh lịch nếu thêm một kiểu tích hợp mới chỉ cho kết quả sizeofvà không có typedef tích hợp chuẩn nào. Do đó, giải pháp di động nhất vào thời điểm đó là đặt size_tbí danh kiểu vào một số tiêu đề và tài liệu cụ thể.
Trong C ++ 11 bây giờ có một cách để viết ra yêu cầu chính xác của tiêu chuẩn như một khai báo đơn giản.