เนื่องจากตัวดำเนินการของ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
: