Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

static_assert trong C++


static_assert là một tính năng cho phép lập trình viên kiểm tra điều kiện tại thời điểm biên dịch. Nếu điều kiện sai, trình biên dịch sẽ báo lỗi với thông điệp tùy chọn, giúp phát hiện lỗi logic sớm mà không ảnh hưởng đến mã thực thi.

Từ C++11, static_assert yêu cầu thông điệp lỗi. Từ C++17, thông điệp trở nên tùy chọn. Nó tương thích với các thư viện assertion khác như BOOST_STATIC_ASSERT.

Cú pháp

static_assert(condition, message); // C++11/14
static_assert(condition); // C++17 trở đi

Ví dụ

#include <bits/stdc++.h>
using namespace std;

template <typename T, size_t N, typename F>
void fillArray(array<T, N> &a, F &&f) {
    // Kiểm tra kiểu trả về của f có thể chuyển sang T không
    static_assert(is_convertible<invoke_result_t<F>, T>::value,
                  "Kiểu trả về không tương thích");
    for (auto &x : a)
        x = f();
}

int main() {
    array<vector<string>, 20> a;
    // Lỗi: lambda trả về vector<string> nhưng mảng chứa vector<string> -> OK
    // Nếu lambda trả về int thì static_assert sẽ báo lỗi khi biên dịch
    fillArray(a, []() { return vector<string>{"Example"}; });
    return 0;
}

Kết quả (nếu vi phạm)

error: static assertion failed: Kiểu trả về không tương thích

Ví dụ trên minh họa việc dùng static_assert để đảm bảo an toàn kiểu tại compile-time.