Anda dapat melakukannya tanpa header:
using size_t = decltype(sizeof(int));
using size_t = decltype(sizeof 1);
using size_t = decltype(sizeof "anything");
Ini karena standar C ++ membutuhkan:
Hasil dari sizeofdan sizeof...merupakan konstanta tipe std::size_t. [Catatan: std::size_tdidefinisikan dalam header standar <cstddef>(18.2). - catatan akhir]
Dengan kata lain, standar tersebut mensyaratkan:
static_assert(std::is_same<decltype(sizeof(int)), std::size_t>::value,
"This never fails.");
Perhatikan juga, bahwa tidak masalah untuk membuat typedefdeklarasi ini di global dan di stdnamespace, selama typedefdeklarasi tersebut cocok dengan semua deklarasi lain dengan nama typedef yang sama (kesalahan kompiler dikeluarkan pada deklarasi yang tidak cocok).
Hal ini karena:
§7.1.3.1 Nama typedef tidak memperkenalkan tipe baru seperti yang dilakukan deklarasi kelas (9.1) atau deklarasi enum.
§7.1.3.3 Dalam lingkup non-kelas tertentu, penentu typedefdapat digunakan untuk mendefinisikan kembali nama jenis apa pun yang dideklarasikan dalam lingkup itu untuk merujuk ke jenis yang telah dirujuk.
Untuk para skeptis yang mengatakan bahwa ini merupakan penambahan tipe baru ke dalam namespace std, dan tindakan seperti itu secara eksplisit dilarang oleh standar, dan ini adalah UB dan itu saja; Saya harus mengatakan bahwa sikap ini berarti mengabaikan dan menyangkal pemahaman yang lebih dalam tentang masalah yang mendasarinya.
Larangan standar menambahkan deklarasi dan definisi baru ke dalam namespace stdkarena dengan melakukan itu pengguna dapat mengacaukan perpustakaan standar dan menembak seluruh kakinya. Untuk penulis standar, lebih mudah untuk membiarkan pengguna mengkhususkan beberapa hal tertentu dan melarang melakukan hal lain untuk ukuran yang baik, daripada melarang setiap hal yang tidak boleh dilakukan pengguna dan berisiko kehilangan sesuatu yang penting (dan kaki itu). Mereka melakukannya di masa lalu ketika mensyaratkan bahwa tidak ada kontainer standar yang dibuat dengan tipe yang tidak lengkap, padahal beberapa kontainer dapat melakukannya dengan baik (lihat Pustakawan Standar: Kontainer Tipe Tidak Lengkap oleh Matthew H. Austern ):
... Pada akhirnya, semuanya tampak terlalu keruh dan terlalu kurang dipahami; Komite standardisasi tidak berpikir ada pilihan lain kecuali mengatakan bahwa kontainer STL tidak seharusnya bekerja dengan tipe yang tidak lengkap. Untuk ukuran yang baik, kami menerapkan larangan itu ke seluruh perpustakaan standar juga.
... Dalam retrospeksi, sekarang teknologi lebih dipahami, keputusan itu pada dasarnya masih tampak benar. Ya, dalam beberapa kasus dimungkinkan untuk mengimplementasikan beberapa kontainer standar sehingga mereka dapat dibuat dengan tipe yang tidak lengkap - tetapi juga jelas bahwa dalam kasus lain itu akan sulit atau tidak mungkin. Kemungkinan besar tes pertama yang kami coba, gunakan std::vector, kebetulan merupakan salah satu kasus yang mudah.
Mengingat bahwa aturan bahasa std::size_tharus tepat decltype(sizeof(int)), melakukan namespace std { using size_t = decltype(sizeof(int)); }adalah salah satu hal yang tidak merusak apa pun.
Sebelum C ++ 11 tidak ada decltypedan dengan demikian tidak ada cara untuk mendeklarasikan tipe sizeofhasil dalam satu pernyataan sederhana tanpa melibatkan banyak template. size_tAlias tipe yang berbeda pada arsitektur target yang berbeda, bagaimanapun, itu tidak akan menjadi solusi yang elegan untuk menambahkan tipe built-in baru hanya untuk hasil sizeof, dan tidak ada typedef bawaan standar. Oleh karena itu, solusi yang paling portabel saat itu adalah dengan meletakkan size_talias tipe di beberapa header dan dokumen tertentu itu.
Di C ++ 11 sekarang ada cara untuk menuliskan persyaratan standar yang tepat sebagai satu deklarasi sederhana.