Vì toán hạng của sizeoftoán tử không được đánh giá, bạn có thể làm điều này:
int f(); //no definition, which means we cannot call it
int main(void) {
printf("%d", sizeof(f()) ); //no linker error
return 0;
}
Bản demo trực tuyến: http://ideone.com/S8e2Y
Đó là, bạn không cần xác định hàm fnếu nó chỉ được sử dụng sizeof. Kỹ thuật này chủ yếu được sử dụng trong siêu lập trình mẫu C ++, vì ngay cả trong C ++, toán hạng của sizeofkhông được đánh giá.
Tại sao điều này làm việc? Nó hoạt động vì sizeoftoán tử không hoạt động theo giá trị , thay vào đó nó hoạt động theo loại biểu thức. Vì vậy, khi bạn viết sizeof(f()), nó hoạt động trên loại biểu thức f(), và không có gì ngoài kiểu trả về của hàm f. Kiểu trả về luôn giống nhau, bất kể giá trị nào hàm sẽ trả về nếu nó thực sự thực thi.
Trong C ++, bạn thậm chí có thể:
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;
}
Tuy nhiên, có vẻ như, sizeoflần đầu tiên tôi tạo một thể hiện A, bằng cách viết A()và sau đó gọi hàm ftrên cá thể, bằng cách viết A().f(), nhưng không có điều đó xảy ra.
Bản trình diễn: http://ideone.com/egPMi
Đây là một chủ đề khác giải thích một số tính chất thú vị khác của sizeof: