เนื่องจากตัวดำเนินการของsizeofตัวดำเนินการไม่ได้รับการประเมินคุณสามารถทำได้:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
การสาธิตออนไลน์: http://ideone.com/S8e2Y
นั่นคือคุณไม่จำเป็นต้องกำหนดฟังก์ชั่นfถ้ามันถูกใช้ในsizeofเท่านั้น เทคนิคนี้ส่วนใหญ่ใช้ใน C ++ เทมเพลต metaprogramming เช่นเดียวกับใน C ++ ตัวถูกดำเนินการของsizeofไม่ได้รับการประเมิน
ทำไมจึงใช้งานได้ มันใช้งานได้เพราะsizeofดำเนินการไม่ทำงานตามมูลค่าแต่จะทำงานกับชนิดของนิพจน์ ดังนั้นเมื่อคุณเขียนsizeof(f())ก็ทำงานเกี่ยวกับประเภทของการแสดงออกf()และซึ่งเป็นอะไร fแต่ประเภทกลับของฟังก์ชั่น ประเภทที่ส่งคืนจะเหมือนกันเสมอไม่ว่ามูลค่าใดที่ฟังก์ชันจะส่งคืนถ้ามันดำเนินการจริง
ใน C ++ คุณสามารถทำได้:
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;
}
แต่ดูเหมือนว่าในsizeofครั้งแรกที่ฉันสร้างอินสแตนซ์AโดยการเขียนA()แล้วเรียกใช้ฟังก์ชันfบนอินสแตนซ์โดยการเขียนA().f()แต่ไม่มีสิ่งใดเกิดขึ้น
ตัวอย่าง: http://ideone.com/egPMi
นี่คือหัวข้อที่อธิบายคุณสมบัติที่น่าสนใจอื่น ๆ ของsizeof: