Một số mở rộng của C++20 so với C++11
Tổng quan các điểm nổi bật của C++20 so với C++11:
1. ✅ Concepts – Kiểm tra ràng buộc kiểu trong template
- C++11: Template không có cách rõ ràng để ràng buộc kiểu; lỗi thường xảy ra khó hiểu khi sử dụng sai kiểu.
- C++20: Thêm concepts để giới hạn kiểu template rõ ràng hơn.
cpp
CopyEdit
template<typename T>
concept Integral = std::is_integral_v<T>;
template<Integral T>
T add(T a, T b) { return a + b; }
2. ✅ Ranges library – Xử lý dãy giá trị hiện đại
- C++11: Phải dùng kết hợp nhiều vòng lặp/phép toán với iterator thủ công.
- C++20: ranges giúp code ngắn gọn, dễ đọc hơn.
cpp
CopyEdit
#include <ranges>
std::vector<int> v = {1,2,3,4,5};
auto evens = v | std::views::filter([](int n){ return n % 2 == 0; });
3. ✅ Coroutines – Hỗ trợ lập trình bất đồng bộ tự nhiên
- C++11: Không có coroutine; lập trình async phải dùng std::async, std::future.
- C++20: Hỗ trợ co_await, co_yield, co_return.
cpp
CopyEdit
task<int> compute() {
co_return 42;
}
4. ✅ Modules – Thay thế tiền xử lý #include
- C++11: Dùng #include gây chậm biên dịch, phụ thuộc chồng chéo.
- C++20: Thêm module giúp biên dịch nhanh hơn, tránh include vòng.
cpp
CopyEdit
export module math;
// implementation
5. ✅ Constexpr mạnh hơn
- C++11: constexpr chỉ cho các hàm đơn giản.
- C++20: Cho phép nhiều lệnh phức tạp hơn trong constexpr, kể cả vòng lặp, khối lệnh, try-catch.
6. ✅ Three-way comparison (<=>) – Toán tử so sánh tàu vũ trụ
- C++11: Phải viết thủ công tất cả toán tử <, ==, >, v.v.
- C++20: Toán tử <=> giúp tự động sinh các phép so sánh.
cpp
CopyEdit
auto result = a <=> b;
if (result < 0) { ... }
7. ✅ Improved Lambdas
- C++11: Lambda đơn giản, không có template trong lambda.
- C++20:
- Lambda có thể là template.
- Cho phép constexpr, default, requires, etc.
cpp
CopyEdit
auto lambda = []<typename T>(T a, T b) { return a + b; };
8. ✅ New std::format – Format chuỗi giống Python
- C++11: Dùng stringstream hoặc printf.
- C++20: Thêm std::format.
cpp
CopyEdit
std::string msg = std::format("Hello {}!", "world");
9. ✅ Calendar & Timezone trong <chrono>
- C++11: Chỉ hỗ trợ thời gian đơn giản.
- C++20: Hỗ trợ xử lý ngày tháng, múi giờ đầy đủ.
10. ✅ Others:
- [[likely]], [[unlikely]] → gợi ý cho compiler nhánh thường xảy ra.
- consteval → bắt buộc tính toán lúc compile-time.
- std::span<T> → thao tác mảng như view an toàn.
- init-statement trong if, switch.