1. Vấn đề nó giải quyết
constexpr cho phép tính tại compile time khi input phù hợp; static_assert từ chối build nếu điều kiện compile time sai. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 31, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: constexpr cho phép tính tại compile time khi input phù hợp; static_assert từ chối build nếu điều kiện compile time sai. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
constexpr int square(int x) { return x*x; } static_assert(square(3)==9, "bad");5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Thân hàm
constexprC++11 bị hạn chế hơn chuẩn mới; ví dụ C++14 có thể không compile ở chế độ C++11.
7. Khi nào nên dùng
Nên dùng khi quy tắc hoặc giá trị có thể được kiểm tra trước khi chương trình chạy.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Hàm square tương thích C++11 tạo kích thước mảng hằng và static assertion xác minh kết quả khi biên dịch. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/32_constexpr_static_assert/main.cpp
#include <iostream>
constexpr int square(int value) {
return value * value; // valid C++11 constexpr body
}
static_assert(square(3) == 9, "square must work");
int main() {
constexpr int side = 4;
int cells[square(side)] = {};
cells[0] = 7;
std::cout << "cell_count=" << square(side) << '\n';
std::cout << "first=" << cells[0] << '\n';
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ —
constexprvàstatic_assertcó vai trò gì khác nhau? Với hàmconstexpr int square(int x) { return x*x; },static_assert(square(3) == 9, "bad")kiểm tra điều gì và khi nào?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Thân hàm
constexprC++11 bị hạn chế hơn chuẩn mới; ví dụ C++14 có thể không compile ở chế độ C++11. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?