Khẳng định tĩnh được sử dụng để thực hiện xác nhận tại thời điểm biên dịch. Khi xác nhận tĩnh không thành công, chương trình chỉ đơn giản là không biên dịch. Điều này hữu ích trong các tình huống khác nhau, chẳng hạn như nếu bạn triển khai một số chức năng bằng mã phụ thuộc nghiêm trọng vào unsigned int
đối tượng có chính xác 32 bit. Bạn có thể đặt một khẳng định tĩnh như thế này
static_assert(sizeof(unsigned int) * CHAR_BIT == 32);
trong mã của bạn. Trên một nền tảng khác, với unsigned int
kiểu kích thước khác, quá trình biên dịch sẽ không thành công, do đó, nhà phát triển thu hút sự chú ý của nhà phát triển đến phần có vấn đề của mã và khuyên họ nên triển khai lại hoặc kiểm tra lại nó.
Ví dụ khác, bạn có thể muốn chuyển một số giá trị tích phân dưới dạng void *
con trỏ đến một hàm (một cách hack, nhưng đôi khi hữu ích) và bạn muốn đảm bảo rằng giá trị tích phân sẽ phù hợp với con trỏ
int i;
static_assert(sizeof(void *) >= sizeof i);
foo((void *) i);
Bạn có thể muốn tài sản mà char
loại được ký
static_assert(CHAR_MIN < 0);
hoặc phép chia tích phân đó với các giá trị âm làm tròn về 0
static_assert(-5 / 2 == -2);
Và như thế.
Xác nhận thời gian chạy trong nhiều trường hợp có thể được sử dụng thay cho xác nhận tĩnh, nhưng xác nhận thời gian chạy chỉ hoạt động tại thời gian chạy và chỉ khi quyền kiểm soát vượt qua xác nhận. Vì lý do này, xác nhận thời gian chạy không thành công có thể nằm im, không bị phát hiện trong thời gian dài.
Tất nhiên, biểu thức trong khẳng định tĩnh phải là một hằng số thời gian biên dịch. Nó không thể là một giá trị thời gian chạy. Đối với các giá trị thời gian chạy, bạn không có lựa chọn nào khác ngoài việc sử dụng giá trị thông thường assert
.