Vì toán hạng của sizeof
toá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 f
nế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 sizeof
không được đánh giá.
Tại sao điều này làm việc? Nó hoạt động vì sizeof
toá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ư, sizeof
lầ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 f
trê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
: