Karena operan sizeofoperator tidak dievaluasi, Anda dapat melakukan ini:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Demo online: http://ideone.com/S8e2Y
Artinya, Anda tidak perlu mendefinisikan fungsi fjika hanya digunakan sizeof. Teknik ini banyak digunakan dalam metaprogramming template C ++, karena bahkan dalam C ++, operan sizeoftidak dievaluasi.
Mengapa ini bekerja? Ini bekerja karena sizeofoperator tidak beroperasi pada nilai , melainkan beroperasi pada jenis ekspresi. Jadi ketika Anda menulis sizeof(f()), ini beroperasi pada tipe ekspresi f(), dan yang tidak lain adalah tipe kembalinya fungsi f. Jenis kembali selalu sama, tidak peduli berapa nilai fungsi akan kembali jika itu benar-benar dijalankan.
Di C ++, Anda dapat meratakan ini:
struct A
{
A(); //no definition, which means we cannot create instance!
int f(); //no definition, which means we cannot call it
};
int main() {
std::cout << sizeof(A().f())<< std::endl;
return 0;
}
Namun sepertinya, dalam sizeof, saya pertama kali membuat contoh A, dengan menulis A(), dan kemudian memanggil fungsif pada contoh, dengan menulis A().f(), tetapi tidak ada hal seperti itu terjadi.
Demo: http://ideone.com/egPMi
Berikut adalah topik lain yang menjelaskan beberapa sifat menarik lainnya dari sizeof: