Karena operan sizeof
operator 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 f
jika hanya digunakan sizeof
. Teknik ini banyak digunakan dalam metaprogramming template C ++, karena bahkan dalam C ++, operan sizeof
tidak dievaluasi.
Mengapa ini bekerja? Ini bekerja karena sizeof
operator 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
: